{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b'\\x00\\x00\\x00\\x02'"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import struct\n",
    "struct.pack('>i',2)\n",
    "##path C:\\Users\\Ethan\\Desktop\\ML"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2051, 60000, 28, 28)\n",
      "47040000\n"
     ]
    }
   ],
   "source": [
    "import struct\n",
    "with open(r'C:\\Users\\Ethan\\Desktop\\ML\\train-images.idx3-ubyte','rb') as f:\n",
    "    buffer = f.read(4*4)\n",
    "    head = struct.unpack('>iiii',buffer)\n",
    "    print(head)\n",
    "    length = head[1] *head[2]*head[3]\n",
    "    print(length)\n",
    "    buffer = f.read(length)\n",
    "    data = struct.unpack('>{}B'.format(length),buffer)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "47040000"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "imgs = np.reshape(data,(head[1],head[2],head[3]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "imgs.shape\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAADgpJREFUeJzt3X+MVfWZx/HPs1j+kKI4aQRCYSnEYJW4082IjSWrxkzVDQZHrekkJjQapn8wiU02ZA3/VNNgyCrslmiamaZYSFpKE3VB0iw0otLGZuKIWC0srTFsO3IDNTjywx9kmGf/mEMzxbnfe+fec++5zPN+JeT+eM6558kNnznn3O+592vuLgDx/EPRDQAoBuEHgiL8QFCEHwiK8ANBEX4gKMIPBEX4gaAIPxDUZc3cmJlxOSHQYO5u1SxX157fzO40syNm9q6ZPVrPawFoLqv12n4zmybpj5I6JQ1Jel1St7sfSqzDnh9osGbs+ZdJetfd33P3c5J+IWllHa8HoInqCf88SX8Z93goe+7vmFmPmQ2a2WAd2wKQs3o+8Jvo0OJzh/Xu3i+pX+KwH2gl9ez5hyTNH/f4y5KO1dcOgGapJ/yvS7rGzL5iZtMlfVvSrnzaAtBoNR/2u/uImfVK2iNpmqQt7v6H3DoD0FA1D/XVtDHO+YGGa8pFPgAuXYQfCIrwA0ERfiAowg8ERfiBoAg/EBThB4Ii/EBQhB8IivADQRF+ICjCDwRF+IGgCD8QFOEHgiL8QFCEHwiK8ANBEX4gKMIPBEX4gaAIPxAU4QeCIvxAUIQfCIrwA0ERfiAowg8EVfMU3ZJkZkclnZZ0XtKIu3fk0RTyM23atGT9yiuvbOj2e3t7y9Yuv/zy5LpLlixJ1tesWZOsP/XUU2Vr3d3dyXU//fTTZH3Dhg3J+uOPP56st4K6wp+5zd0/yOF1ADQRh/1AUPWG3yXtNbM3zKwnj4YANEe9h/3fcPdjZna1pF+b2f+6+/7xC2R/FPjDALSYuvb87n4suz0h6QVJyyZYpt/dO/gwEGgtNYffzGaY2cwL9yV9U9I7eTUGoLHqOeyfLekFM7vwOj939//JpSsADVdz+N39PUn/lGMvU9aCBQuS9enTpyfrN998c7K+fPnysrVZs2Yl173vvvuS9SINDQ0l65s3b07Wu7q6ytZOnz6dXPett95K1l999dVk/VLAUB8QFOEHgiL8QFCEHwiK8ANBEX4gKHP35m3MrHkba6L29vZkfd++fcl6o79W26pGR0eT9YceeihZP3PmTM3bLpVKyfqHH36YrB85cqTmbTeau1s1y7HnB4Ii/EBQhB8IivADQRF+ICjCDwRF+IGgGOfPQVtbW7I+MDCQrC9atCjPdnJVqffh4eFk/bbbbitbO3fuXHLdqNc/1ItxfgBJhB8IivADQRF+ICjCDwRF+IGgCD8QVB6z9IZ38uTJZH3t2rXJ+ooVK5L1N998M1mv9BPWKQcPHkzWOzs7k/WzZ88m69dff33Z2iOPPJJcF43Fnh8IivADQRF+ICjCDwRF+IGgCD8QFOEHgqr4fX4z2yJphaQT7r40e65N0g5JCyUdlfSAu6d/6FxT9/v89briiiuS9UrTSff19ZWtPfzww8l1H3zwwWR9+/btyTpaT57f5/+ppDsveu5RSS+5+zWSXsoeA7iEVAy/u++XdPElbCslbc3ub5V0T859AWiwWs/5Z7t7SZKy26vzawlAMzT82n4z65HU0+jtAJicWvf8x81sriRltyfKLeju/e7e4e4dNW4LQAPUGv5dklZl91dJ2plPOwCapWL4zWy7pN9JWmJmQ2b2sKQNkjrN7E+SOrPHAC4hFc/53b27TOn2nHsJ69SpU3Wt/9FHH9W87urVq5P1HTt2JOujo6M1bxvF4go/ICjCDwRF+IGgCD8QFOEHgiL8QFBM0T0FzJgxo2ztxRdfTK57yy23JOt33XVXsr53795kHc3HFN0Akgg/EBThB4Ii/EBQhB8IivADQRF+ICjG+ae4xYsXJ+sHDhxI1oeHh5P1l19+OVkfHBwsW3vmmWeS6zbz/+ZUwjg/gCTCDwRF+IGgCD8QFOEHgiL8QFCEHwiKcf7gurq6kvVnn302WZ85c2bN2163bl2yvm3btmS9VCrVvO2pjHF+AEmEHwiK8ANBEX4gKMIPBEX4gaAIPxBUxXF+M9siaYWkE+6+NHvuMUmrJf01W2ydu/+q4sYY57/kLF26NFnftGlTsn777bXP5N7X15esr1+/Pll///33a972pSzPcf6fSrpzguf/093bs38Vgw+gtVQMv7vvl3SyCb0AaKJ6zvl7zez3ZrbFzK7KrSMATVFr+H8kabGkdkklSRvLLWhmPWY2aGblf8wNQNPVFH53P+7u5919VNKPJS1LLNvv7h3u3lFrkwDyV1P4zWzuuIddkt7Jpx0AzXJZpQXMbLukWyV9ycyGJH1f0q1m1i7JJR2V9N0G9gigAfg+P+oya9asZP3uu+8uW6v0WwFm6eHqffv2JeudnZ3J+lTF9/kBJBF+ICjCDwRF+IGgCD8QFOEHgmKoD4X57LPPkvXLLktfhjIyMpKs33HHHWVrr7zySnLdSxlDfQCSCD8QFOEHgiL8QFCEHwiK8ANBEX4gqIrf50dsN9xwQ7J+//33J+s33nhj2VqlcfxKDh06lKzv37+/rtef6tjzA0ERfiAowg8ERfiBoAg/EBThB4Ii/EBQjPNPcUuWLEnWe3t7k/V77703WZ8zZ86ke6rW+fPnk/VSqZSsj46O5tnOlMOeHwiK8ANBEX4gKMIPBEX4gaAIPxAU4QeCqjjOb2bzJW2TNEfSqKR+d/+hmbVJ2iFpoaSjkh5w9w8b12pclcbSu7u7y9YqjeMvXLiwlpZyMTg4mKyvX78+Wd+1a1ee7YRTzZ5/RNK/uftXJX1d0hozu07So5JecvdrJL2UPQZwiagYfncvufuB7P5pSYclzZO0UtLWbLGtku5pVJMA8jepc34zWyjpa5IGJM1295I09gdC0tV5Nwegcaq+tt/MvijpOUnfc/dTZlVNByYz65HUU1t7ABqlqj2/mX1BY8H/mbs/nz193MzmZvW5kk5MtK6797t7h7t35NEwgHxUDL+N7eJ/Iumwu28aV9olaVV2f5Wknfm3B6BRKk7RbWbLJf1G0tsaG+qTpHUaO+//paQFkv4s6VvufrLCa4Wconv27NnJ+nXXXZesP/3008n6tddeO+me8jIwMJCsP/nkk2VrO3em9xd8Jbc21U7RXfGc391/K6nci90+maYAtA6u8AOCIvxAUIQfCIrwA0ERfiAowg8ExU93V6mtra1sra+vL7lue3t7sr5o0aKaesrDa6+9lqxv3LgxWd+zZ0+y/sknn0y6JzQHe34gKMIPBEX4gaAIPxAU4QeCIvxAUIQfCCrMOP9NN92UrK9duzZZX7ZsWdnavHnzauopLx9//HHZ2ubNm5PrPvHEE8n62bNna+oJrY89PxAU4QeCIvxAUIQfCIrwA0ERfiAowg8EFWacv6urq656PQ4dOpSs7969O1kfGRlJ1lPfuR8eHk6ui7jY8wNBEX4gKMIPBEX4gaAIPxAU4QeCIvxAUObu6QXM5kvaJmmOpFFJ/e7+QzN7TNJqSX/NFl3n7r+q8FrpjQGom7tbNctVE/65kua6+wEzmynpDUn3SHpA0hl3f6rapgg/0HjVhr/iFX7uXpJUyu6fNrPDkor96RoAdZvUOb+ZLZT0NUkD2VO9ZvZ7M9tiZleVWafHzAbNbLCuTgHkquJh/98WNPuipFclrXf3581stqQPJLmkH2js1OChCq/BYT/QYLmd80uSmX1B0m5Je9x90wT1hZJ2u/vSCq9D+IEGqzb8FQ/7zcwk/UTS4fHBzz4IvKBL0juTbRJAcar5tH+5pN9IeltjQ32StE5St6R2jR32H5X03ezDwdRrsecHGizXw/68EH6g8XI77AcwNRF+ICjCDwRF+IGgCD8QFOEHgiL8QFCEHwiK8ANBEX4gKMIPBEX4gaAIPxAU4QeCavYU3R9I+r9xj7+UPdeKWrW3Vu1Lorda5dnbP1a7YFO/z/+5jZsNuntHYQ0ktGpvrdqXRG+1Kqo3DvuBoAg/EFTR4e8vePsprdpbq/Yl0VutCumt0HN+AMUpes8PoCCFhN/M7jSzI2b2rpk9WkQP5ZjZUTN728wOFj3FWDYN2gkze2fcc21m9msz+1N2O+E0aQX19piZvZ+9dwfN7F8L6m2+mb1sZofN7A9m9kj2fKHvXaKvQt63ph/2m9k0SX+U1ClpSNLrkrrd/VBTGynDzI5K6nD3wseEzexfJJ2RtO3CbEhm9h+STrr7huwP51Xu/u8t0ttjmuTMzQ3qrdzM0t9Rge9dnjNe56GIPf8ySe+6+3vufk7SLyStLKCPlufu+yWdvOjplZK2Zve3auw/T9OV6a0luHvJ3Q9k909LujCzdKHvXaKvQhQR/nmS/jLu8ZBaa8pvl7TXzN4ws56im5nA7AszI2W3Vxfcz8UqztzcTBfNLN0y710tM17nrYjwTzSbSCsNOXzD3f9Z0l2S1mSHt6jOjyQt1tg0biVJG4tsJptZ+jlJ33P3U0X2Mt4EfRXyvhUR/iFJ88c9/rKkYwX0MSF3P5bdnpD0gsZOU1rJ8QuTpGa3Jwru52/c/bi7n3f3UUk/VoHvXTaz9HOSfubuz2dPF/7eTdRXUe9bEeF/XdI1ZvYVM5su6duSdhXQx+eY2YzsgxiZ2QxJ31TrzT68S9Kq7P4qSTsL7OXvtMrMzeVmllbB712rzXhdyEU+2VDGf0maJmmLu69vehMTMLNFGtvbS2PfePx5kb2Z2XZJt2rsW1/HJX1f0n9L+qWkBZL+LOlb7t70D97K9HarJjlzc4N6Kzez9IAKfO/ynPE6l364wg+IiSv8gKAIPxAU4QeCIvxAUIQfCIrwA0ERfiAowg8E9f/Ex0YKZYOZcwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for i in range(5):\n",
    "    plt.imshow(imgs[i],cmap='gray')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\utils\\deprecation.py:77: DeprecationWarning: Function fetch_mldata is deprecated; fetch_mldata was deprecated in version 0.20 and will be removed in version 0.22\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\utils\\deprecation.py:77: DeprecationWarning: Function mldata_filename is deprecated; mldata_filename was deprecated in version 0.20 and will be removed in version 0.22\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_mldata\n",
    "mnist = fetch_mldata('MNIST original',data_home=r'C:\\Users\\Ethan\\Desktop\\mnist-original\\mldata')\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'COL_NAMES': ['label', 'data'],\n",
       " 'target': array([0., 0., 0., ..., 9., 9., 9.]),\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ...,\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)}"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "X,y = mnist['data'],mnist['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "some_digit=X[46000]\n",
    "some_digit_image = some_digit.reshape(28,28)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(some_digit_image,cmap=matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.0"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[26000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train,x_test,y_train,y_test=X[:60000],X[60000:],y[:60000],y[60000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([13271, 44037, 27476, ..., 23623, 30737, 44464])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shuffle_index = np.random.permutation(60000)\n",
    "shuffle_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train,y_train=x_train[shuffle_index],y_train[shuffle_index]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       ...,\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "洗牌  shuffle操作"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练一个二元分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False,  True, False])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5 = (y_train ==5)\n",
    "y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False,  True],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       ...,\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [ True, False, False, ...,  True, False, False],\n",
       "       [False, False, False, ..., False,  True, False]])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5.reshape(20,-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_5=(y_test==5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import SGDClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf=SGDClassifier(random_state=42)\n",
    "sgd_clf.fit(x_train,y_train_5)\n",
    "sgd_clf.predict([some_digit])\n",
    "#sgd 梯度下降法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 性能考核\n",
    "\n",
    "## 使用交叉验证测量精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.96085783, 0.94736053, 0.93086383, 0.950045  , 0.94614461,\n",
       "       0.96189619, 0.94344434, 0.95814581, 0.96534653])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "cross_val_score(sgd_clf,x_train,y_train_5,cv=9,scoring=\"accuracy\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 得到精度 分别为 0.96775645, 0.96445711, 0.96820636, 0.95394539, 0.93249325,\n",
    "      "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_predict\n",
    "y_train_pred=cross_val_predict(sgd_clf,x_train,y_train_5,cv=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53491,  1088],\n",
       "       [ 1329,  4092]], dtype=int64)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "confusion_matrix(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 行代表类别 列表示预测类别 二分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]], dtype=int64)"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_t_pp=y_train_5\n",
    "confusion_matrix(y_train_5,y_t_pp)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 正确预测的准确率 被称为分类器的精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.78996138996139"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score,recall_score\n",
    "precision_score(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7548422800221362"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "(array([False, False, False, ..., False,  True, False]), array([False, False, False, ..., False,  True, False]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7720026412602584"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-311246.19273626])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold=0\n",
    "y_some_digit_pred=(y_scores>threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold=-10000\n",
    "y_some_digit_pred=(y_scores>threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "y_scores=cross_val_predict(sgd_clf,x_train,y_train_5,cv=3,method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "precisions,recalls,thresholds=precision_recall_curve(y_train_5,y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfYAAAEPCAYAAACwduZtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd4FFXbwOHfyWZTCUkICS0hIEVAqoRepXdEkSIKokgTREVesAGivCr1UwEBUXhBulSRZgVpQkBQOkgLPYSevrvz/TGpkECAJLO7eW6uvXbKmZlnskuenDNnzihN0xBCCCGEc3AxOgAhhBBCZB9J7EIIIYQTkcQuhBBCOBFJ7EIIIYQTkcQuhBBCOBFJ7EIIIYQTuW9iV0p9q5S6rJTan8l6pZT6Qil1XCn1t1LqyewPUwghhBBZkZUa+xyg1T3WtwbKJL36Al89elhCCCGEeBj3Teyapm0Grt6jSEdgrqbbAfgppYpkV4BCCCGEyDrXbNhHMSAizfzZpGUX7iyolOqLXqvHzcutun8xf5RSJP9zUS4opfAye5HPLR8ACdYEbsTdAJW0j+SJJAU8C+Ci9L9PbifcJtGWiAsuoEjZr1IKs4sZd1f3lO3irfGYlAmTi+mufQohhMhcfDycPAkuLqCU/p52ulAhcE/6dXvrFsTGpq5LW97VFby8Uvdrs+nLLRb4+29IHhj1iSfAw0OfPnkSrmZS1cyXDx5/PHVff/2V+TmUKAEBAfr0pUtw9mzG5ZSCJ9NcYD5wAOLiMi4bFAQhIfr07dtw5EhGpXZf0TQtMPPIHl12JPaMsmKG49RqmjYTmAngXtxdu9TjUoY7fKf+O/y36X8BWH98Pa3nt8704JuGbCLULxSAZxY/w4rDKzIs17p0a9b2WAvApduXKDyxcMo6L7MXri6umJQJVxdX5j8zn+almgMwZecUZu2ZhcnFlFLGbDLj4+ZDUZ+izGw/M2U/I34eQZwlDhflkvJK/uOhTZk21A2pC8DZm2cJPx+Ou8kdH3cfPF09cTO54efhR6F8hXAzuWV6vkIIkZ0++QQuX4bJk/X5U6fgrbcgf37w9dVfAQHg4wOBgdCunZ4wq1fPfJ8//gg1aujTAwbA9OkZl6tUCcLD9WlNAzc3/d3dXX+vWRMGD9aP6eenl9u6VU/uGQkMhJYt9WmLBRYtyjzGunXhscf06UOHYPfujMuZTNC9e+r8Dz/AjRsZly1XDsLC9OnLl2HjxrvLvPiiOp15VNkjOxL7WSAkzXwwcP5+GxXJV4QBTQdgsVmw2CwkWBOITozGptmoE1wnpVxI/hD6Ve+HpmloaGiahk2zkTSXUrMHaFC8ARpayj7T7rtMgTLpjh/qG8r1uOvcjL9JTGJMunUWmyVl+vyt8+y7tC/DcyjpVzLd/PTw6dyIz/gT93X3TUnsf5z+g+eXP5/pzyb63Wi8zPqfsQPWDOBK7BXyu+XHzeSG2WTG2+yNp9mTGkVr0LqM/kfP1dir/H7qd3zdfXF3dcfsYsbH3YeCXgVT/oBIbtkQQjiu+Hg9Aao7qlTR0TBnjp50du7UE1JAgJ6A+/XTy6xeDd9+C0WL6q/9+2HxYj3JRUeDtzdcuAArMq4fUa8eHD2q72/rVr3mmtGrRInUbZ56So/3zjKxsVAyza/QhAS9tp6QADFJv5LffRc6drw7hnr17v9zcnWFF164fzmA8uX1V1a0b5+1ckFBGR//xReztv2jUFl5CIxSqgSwRtO0ihmsawsMAtoAtYAvNE2reb99hoWFaeHJf6oZyGqzEpMYg1WzYrVZsWrWlOQIcOHWBS5FX8Jis2C1WbHYLMRZ4ohOjMbN5Ear0qn9CqeHTyfOEodNs2HTbFhtVmyajXhrPM0ea0b94vUB+P3U70zeMZnYxFhuJdwi3hJPvDWeqJgoLkdfJvGDREwuJgCqTK/C35f+zjD2gWEDmdp2KgDbI7ZT99u6mZ7n4dcO83hBvY1qyLoh/HzyZ1xdXDG7mAn0DiTUN5SiPkUpV7AcXZ7oAkBsYiwb/t1AcP5gyhUsl+6PKCHE/WmanqjOndObp729U9fFxcGyZXrtNDhYb8KNi4PffoPQUGjcGMxmvYZ47BiMHZvaBO3uDoULw8yZ0KKFvuzORJ+sfXs9oQN8+im8887dZZTSm64BoqLg99/h5k39dfUqXLumT9+4Aa1bQ9++2fHTyVhCgt6MrRT4++fccYyilNqtaVpYTh7jvjV2pdRCoDFQUCl1FhgFmAE0TZsOrEVP6seBGKB3TgWbE0wuJnzcfTJdX8SnCEV8stYXsH9Y/yyVa1yiMY1LNM5wndVmTUnqALM7zuZg5EHiLHEkWhNJsCZwM/4mCdYEahZL/fspv3t+2pVtp/czsCYSZ4njcvRlYhJjiLfG4+HqkVL2zM0zHIw8mOHx25dtn5LYr8RcodPiTinr/D38CfENobhvcULyhzCi/giK+xYHYNe5XUTcjMDsYsZsMhPkHUSFwArpjiuEs7lyRW/uvXxZT7aDB4PVCo0awT//3F3e1xdefRXGj4fly6F3b0hMzHjfcXF6LXr5cli4UK+pJ4uPh9On9Vp5Mj8/uH4dqlXTr0c/95x+/bpo0dQyXbpA6dJw/rxeMz9/Xr++PG9eapmAAHj22Uf7uTwKNzcoUMC44zuDLNXYc4K91NjzorM3z3I97joWm4V4SzyRMZEcv3qcqJgoygaU5cUqelvRpduXeGX1K5y6forDVw5j1azp9rO3316qFK4CQM8VPZn397x06z1dPQnxDaF8wfKs6LoCpRRWm76PtH+8CGHPbDa9Bpk/vz7fpYt+HTomRu9Ildb58/q16H37oGdPOHEidZ2bm14bffttPbGD3qw9eLBeS46I0P9AAL0GH5HUJTkmBt5/H379VW/i/uwzff3Fi3qtPbkVYNcu/Y+LypVz6ichsoNd1NiF8wnOH0xw/uD7liuUrxBrnl8DQKI1kciYSCJuRHDmxhku3L6Qbh/Vi1TnVsItEq2JxCTGcPrGaU5cO8HRqKM0LN4QldROuOXMFlp+15JQv1B83X3xdvOmoFdBAr0CKRtQlv5h/aWWL3KFxaLXcAsW1GvZc+boTdUmk/66fVuvNV++DK+/Dp9/rm8XE6Mn0bTatdOv0ebPryfasDD45Rfw9NR7hZcooe8zKir9dmXLwoYNqfNWa/paOOi17kmT7o6/VKn088md1YSQGrvIMVdjr3Lh1gUCvQMJ8g4CYMmBJXT9vmum29x+5zbebnoVpOncppy6foqiPkWpUqgKj/k/RqhvKGUCyhDqG4qvh2+unIdwDpoGf/wBc+fCn3/qHcd8fPRrx7dv64n46acz3rZTJ71JHGDbNj2xV6yod/aqXVtP4EJkRW7U2O06sd+4cYMrV66QkJCQS1GJ3GDTbFhslpQ7HGyaDatmJdGWSICnfmOpm5sb72x/h6X/Ls1wH8PqDmNc83EA/HPpH7ZGbKVNmTYp1/xF3vXvv3pnsQYN9JqzpsGIETBuXMblk38Fbt0Kmzfr06GhetO52az3Ki9WLPPOaUI8iDzdFB8XF8elS5cIDg7G09MzpSlXOD9N04iNjWVMjTF82PRDzsacZe/FvZy5cYajV48ScSOCUv6p7ZA7zu5gwI8DAP02xlIFSlE3uC7PPfEclYIqyXfHycXFwaZN+n3I772XunzWLD2xKwWRkXdvN2UKvPRS6nxWb6MSwt7ZbY09IiKCfPny4e+M9zuILLl69SrR0dGEhITcs9wfp/9g3LZxbDi+gURb+i7G3Sp2Y8EzC1BKEW+JRyklAwA5kYUL4fkMhoQIDoYFC/RaO+hN8MWK6TXxO69hC5Gb8nyNvXDhwvcvKJyWj48PUXf2NspAg9AGNAhtwI24G5y9eZaDkQdZcnAJq4+sppB3oZQa+9KDS3lp5UuUCShD5UKVaRzamE7lO1E4n3zPHIHNpt9PffWq3uHN3z/j+5wPHdJHAEsrOcELkRfYbWK3WCy4utpteCIXuLq6YrFY7l8wia+HL74evjwR9ATPPfEcmqalGwkwOiEaq2bl8JXDHL5ymCUHlvD6+td5pdorDKk1hPKBWRx6SuSamBj9Xu7evfVhSpPNmqWP6tW0KaxbB02a6NfEhRBZe2yrYeTaaN72qJ+/Ugo/D7+U+X5h/bg54iZ/9P6DT5t+SoPiDbDYLMzYPYOv93ydUu7S7Utcup3xcwxE7tm0Sb91LCgofVIHfZAXm03v3NaqlSR1IdKy68QuRHbzcfehfvH6DK8/nM29N/N7r9/pVaVXulH8Zu6eSeGJhWkwuwFz9s4h3hJ/jz2K7LJ5sz4u+PXr+nzdO0ZIbtZMT+aapr/LLWZCZEzaukWe1qhEIxqVaJRumZvJDVcXV7ac2cKWM1t4be1rtC/bnprFatKzSk8KehU0KFrndPOmPoTpzz/r89Wr6/eZFyigj03u4yO3mgnxIKTGnovmzJmjP38+6eXj40OVKlWYMmXKA11LflSjR49+4Gbuxo0b07hx45wJyM4Mrz+cC0MvMKH5BIr7FicmMYbFBxYzdONQBq8bbHR4TqVmTX389OSkDvDFF3rnOBcXfSQ3SepCPBipsRtg6dKlBAcHc/PmTZYuXcrgwYO5fPkyY8aMyZXj9+nTh1atWt2/YBrTpk3LoWjsU0GvggytO5ShdYdyKPIQ64+v59dTvzK9beqDpd/95V2K+xanyxNdKOApT614UM8+m35o1rZt9SeZSSIX4tHY7X3shw4donxWH5DrIObMmUPv3r05duwYpUuXTln+1FNPsXv3bm7evHnXNpqmkZiYiFse7R1kz9+D0l+U5t9r/2J2MdP0saaMbjSaWsG1jA7Lbl28CGfO6GOaKwUbN0LLlvqY58eOSUIXeUNu3McuTfF2oEaNGty6dYvLly9TokQJXnjhBb799lvKlSuHm5sbPyZ1CY6JiWH48OGULFkSNzc3SpYsydixY7ElP0g5SWRkJAMHDiQkJAR3d3dCQkJ48cUXiU967mNGTfGff/455cuXx9PTE39/f8LCwlixYkXK+oya4o8cOUKnTp3w8/PD09OT2rVrs379+nRlko917Ngx2rZtS758+QgNDWXMmDF3xe1INE1jaJ2hhBUNI9GWyPrj66n9TW1afdeKzac3Gx2e3Rk3DooUgVq14K+/9GVPPQV798Lx45LUhchODpnYlcr8NXNmarmZM+9dNq3q1TMv17dvarndu7P/fE6ePInJZCJfvnwA/Pbbb0yaNIlRo0axfv16KleujMVioWXLlsyaNYshQ4awbt06+vTpw0cffcSwYcNS9nXt2jXq1q3L4sWLeeutt1i7di3jxo0jMTEx0zH358+fz9ChQ+nevTtr165l/vz5dO7cmatXr2Ya8/nz56lfvz779u1jypQpLFmyBD8/P9q2bcu6devuKt+pUyeaNGnCypUrefrppxk1ahT/+9//HvEnZxylFANqDGDXq7s4Pvg4L1V9CVcXVzb8u4EOCztwK/6W0SHahdhYvYl9+PDUZVu26O9mM1SpYkxcQjgzucZuAKvVisVi4datWyxZsoTly5fTvn17vLy8AD057969O93Ie/PmzWPLli1s2rSJhg0bAtC0aVMAPvzwQ4YPH05QUBCTJ0/mxIkThIeHU61atZTtu3fvnmk827dvp3LlyowcOTJlWZs2be55DpMmTeLatWts37495bJCmzZtqFChAu+99x6tW7dOV37o0KH07t0bgGbNmvHrr7+ycOHClGWOrFSBUszuOJuPnvqIz3d8Tj63fPi4+wBgsVlwUS64KIf8G/qRLF2qP7s8rbg4/ZnhQoic45C/bTQt81fa2nXfvvcum9bu3ZmXS9sKUL36o8dfrlw5zGYzBQoUYODAgfTo0YNvv/02ZX3t2rXvGk53/fr1hIaGUrduXSwWS8qrRYsWJCYmsmPHDgA2btxIjRo10iX1+6lRowZ79+5l8ODB/Pzzz8TExNx3m82bN1O7du10fQVMJhPdu3dn7969d/UXaNu2bbr5ihUrcubMmSzH6AiC8wczvsV4RjZK/QPpkz8+ofrM6uy/vN/AyHKfpsHkyanzX3+tL5OkLkTOkxq7AVasWEFwcDA+Pj6Ehobi4eGRbn2RIkXu2uby5cucPn0as9mc4T6Tx1SPioqiygO2b/bs2ZO4uDi++eYbpk2bhtlspk2bNkyaNIkSJUpkuM3Vq1cz/OOhcOHCaJrGtWvXyJ8/f8ryAgXS9xp3d3cnLi7ugeJ0FMn9F67FXmPqrqlcir5Epa8qEVY0jJ6Ve9K5QmeK+Nz9GTu6c+fg++/hxRf1e9Dr1tWb2+fO1R++IoTIHZLYDVCxYsV0Nd07ZXSPeUBAACVLlmTJkiUZbpOcgAsWLMi5c+ceKB6lFP369aNfv35cu3aNjRs3MnToULp27cqff/6Z4TYFChTg4sWLdy2/ePEiSqm7Enle5O/pz8HXDjJ43WCWHVxG+Plwws+HM/zn4UxpM4WeVXri6uIc/wW/+AKGDNGn27bVE/uECcbGJERe5ZBN8XlRq1atUh5lGxYWdterYEF9NLQWLVqwc+dO9u3b91DH8ff3p2vXrnTp0oX9+zNvPm7UqBE7duzg1KlTKcusViuLFy+mWrVq+Pj4PNTxnU0BzwLMf2Y+5946x4TmE3iqxFPEWmIZ/vNwomLu/+Q6RzBwYGpSB31QGSGEcZyjupAH9OjRg9mzZ9O0aVOGDh1KlSpVSEhI4N9//2X16tWsXLkSLy8v3nzzTRYsWECzZs14//33qVSpEleuXGHVqlVMnz49w4Tbt29ffHx8qFOnDkFBQRw9epR58+bRokWLTON58803mTNnDs2bN+fDDz8kf/78TJs2jaNHj6bcnidSBXgFMLTuUN6q8xb/t+P/KBtQlkL5CgEQGR1JgFeAw3Wwu3kT/PzS91eJjoakPqBCCINIYncQZrOZDRs28OmnnzJz5kxOnjyJt7c3pUqVom3btikD2Pj5+bF161bef/99Pv30U6KioihUqBBNmjTJdJCbevXqMXv2bObNm8eNGzcoWrQoL7zwAh9++GGm8RQtWpQtW7YwfPhwBgwYQHx8PFWrVuXHH3984FHt8hKlFG/WeTPdsiHrh7D/8n5mdZiV7mE09kzToE6d1KReqRL8/bexMQkhdDLynLBrzv490DSNslPKcvzqcQCG1hnKBw0/wNfD1+DI7m/6dBgwAFau1J/KJoS4Pxl5Tggnp5RiT989DAgbgItyYeL2iZT+sjQbjm8wOrS72GzQogUkD0jYvz9YLJLUhbA3ktiFMJiPuw/T2k5j4wsbKepTlCsxV2g1vxUfbfrI6NBSbNkCJhP89BM884w+ohzoy4QQ9kUSuxB2ouljTTk++Dj9q/cnn1s+/Dz8MOpSWVp//gkNGqTO//ILeHoaF48Q4t6k85wQdsTT7MlX7b7i/YbvUyx/MQCuxFwh0ZpoyKA2mzdDo0ap88eOwT2GYBBC2AGpsQthh5KTOsCyg8uo+FVFlhxYkqs1+Kio9Ek9KkqSuhCOQBK7EHZM0zR2X9jN1dirdP2+K20WtOFG3I1cOXZiIlSurE8fPaqPJieEsH+S2IWwY0opprebzkdPfYS32Zv1x9fTcVFHIqMjc+yYFov+HhgInTvDkSNQpkyOHU4Ikc0ksQth51yUC+83fJ8dfXZQJF8RNp3eRL1v6xFxIyLbj/XJJ1C+PPzzj97j/YMPoGzZbD+MECIHSWIXwkFUDKrI9le2U6ZAGY5dPUafH/pk6/5/+gnefReOH4c9e7J110KIXCS94oVwIKF+oWx6aROz9sxiWL1h2bbf2Fh98BmA6tWhV69s27UQIpdJjT0XzZkzB6VUysvNzY1SpUrx7rvvGv5s8hIlSvDSSy+lzCfHmvbpbcI+FPEpwgeNPsDD1QOAczfPMXff3EfqMT92bOr0998/aoRCCCNJjd0AS5cuJTg4mFu3brFixQo++eQTbt26xZdffml0aMLBxFni6LioI7sv7OafS/8wvsX4B97H2rWpiX3pUihRIntjFELkrizV2JVSrZRSR5RSx5VSIzJYX1wp9ZtS6i+l1N9KqTbZH6rzqFq1KrVr16Z58+ZMmzaNZs2a8c0332Cz2YwOTTgYd5M7A2sMxOxiZsL2CfRe1RuLzZLl7ePjoW9ffXrAAL0XvBDCsd03sSulTMBUoDVQAeiulKpwR7H3gSWaplUDugHTsjtQZ/bkk08SGxvLlStXUpadPHmSHj16EBgYiLu7O1WrVmVF8tM30ti3bx+dOnUiICAAT09PHn/8cT755JOU9Rs3bqRNmzYUKVIELy8vKlasyMSJE7FarblybiJnKaV4udrLzO44Gw9XD+bsnUPX77uSaE3M0vbu7rBzJ4wfD1On5nCwQohckZWm+JrAcU3TTgAopRYBHYGDacpoQP6kaV/gfHYGeSf1ocp03Yx2M+hbXa+CzNw9k35r+mVaVhuVek2y+szq7LmQcVfgV598lZntZwKw+/xuqhet/jBhZ+rUqVP4+voSEBAAQEREBLVq1SIoKIjJkycTGBjI4sWLefbZZ1m5ciUdOnQAYOfOnTRu3JjSpUszefJkgoODOXbsGH+neTD2iRMnaNq0KYMHD8bDw4Pw8HBGjx5NZGQkn376abaehzBOj8o9KF2gNC2+a8HyQ8sZ8fMIJracmGFZTYMxY6BhQ3jqKShaFN5+O5cDFkLkmKwk9mJA2htmzwK17igzGtiolBoMeAPNMtqRUqov0BegePHiDxqr07BarVgslpRr7MuWLeP//u//MCU9Kmv06NFomsamTZtSkn3Lli2JiIhg5MiRKYn97bffJiAggB07duDl5QVAkyZN0h2rf//+KdOaptGgQQMSEhKYMGEC//3vf3Fxkf6TzqJWcC3+9/T/6LS4E5N2TOLFKi9StXDVdGVsNujTB2bPhiFD9MQuhHAuWUnsGVWP7+x+2x2Yo2naRKVUHWCeUqqipmnpLhprmjYTmAkQFhb20F1409a076Vv9b4ptff72d13d5bKZUdtvVy5cunmBw4cyKBBg1Lm169fT5s2bfD19cViSb1e2rJlS4YNG8bNmzdxdXVl69atDBs2LCWpZ+TChQuMHj2a9evXc/78+XT7u3z5MoULF37k8xH24+lyT/Nl6y8J8AzIMKmXLQv//qvPFy1qQIBCiByXlcR+FghJMx/M3U3trwCtADRN266U8gAKApezI0hns2LFCoKDg4mMjGTSpElMmzaNWrVq0bNnT0BPuHPnzmXu3LkZbh8VFYWbmxs2m43g4OBMj2Oz2ejQoQPnz59n9OjRlCtXDk9PT1auXMnYsWMNv8VO5IxBNQfdtUzT9Np5clJfsQKefjqXAxNC5IqsJPZdQBmlVEngHHrnuOfvKHMGaArMUUqVBzyAnBvM2sFVrFiR0kmPyWrSpAmVK1dm2LBhPPvss3h7exMQEECDBg0YPnx4htsXLVoUq9WKi4sL586dy/Q4//77L+Hh4cybN48XXnghZfkPP/yQvSck7NbOczuZv3cJW0aNY89u/bLL5MmS1IVwZvdN7JqmWZRSg4ANgAn4VtO0A0qpMUC4pmmrgaHA10qpN9Gb6V/ScvP5kg7M3d2d8ePH07FjR6ZNm8awYcNo1aoV27dv54knnsDT0zPTbevXr893333HyJEjMywXExMDgNlsTlmWmJjI/Pnzs/9EhN25FX+L1vNbczX2KhS5DUynUyd44w2jIxNC5KQsDVCjadpaYO0dy0ammT4I1Mve0PKODh06UKNGDSZMmMCgQYMYM2YMNWvWpGHDhgwaNIgSJUpw7do19u/fz4kTJ/j2228BmDBhAo0aNaJOnToMHTqU4OBgTpw4wd69e/nyyy8pX748oaGhvPfee5hMJsxmM5MnTzb4bEVu8Tb78L92S3h2eRsSwmbwdKPHWP72f4wOSwiRw6RLtJ34+OOPuXz5MtOnT6d48eKEh4dTpUoV3n33XZo3b86AAQPYtGlTul7vNWrUYOvWrYSEhDB48GDatGnD+PHjU667u7m5sXLlSgoXLkzPnj157bXXaNiwISNG3DXGkHAysbH609naP9GUKS1nALAyejjLDi4zODIhRE5TRrWYh4WFaeHh4ZmuP3ToEOXLl8/FiIQ9ku/Bg9M0aNsW1q3T5xMTYeyWDxm9aTSerp7s7b+XsgHyLFYhjKCU2q1pWlhOHkNq7EI4mb59U5P6pk3g6grvN3yfRqGNiLXE0mtlr0d6YIwQwr5JYhfCiYSHw6xZ+vSKFfrocgAmFxMruq6gfdn2fNX2K5TKfPRGIYRjk6e7CeEkNA2Sn7zbvfvdt7T5e/qzuvvqXI9LCJG7pMYuhJOYNg0OHNCnP/vs3mUtNgtTd07lzI0zOR+YECJX2XVil+uAeZt8/g+mdGkICoI5cyAk5N5lh6wbwqB1g3h51cvycxbCydhtYjebzcTGxhodhjBQbGxsusF1xL21bKkPGdur1/3LvtfwPbzMXvxy8hc+2vxRzgcnhMg1dpvYg4KCOHfuHDExMVKjyGM0TSMmJoZz584RFBRkdDh2zWaDrl3h6FF9Pl++rG1X1KcoX7f/GoCPN3/M5tObcyhCIURus9vOc/nz6493P3/+PImJiQZHI3Kb2WymUKFCKd8DkbHx42HJEr0HfHw8PEhn9+crPc+mU5uYuWcmLea14M8+f1KlcJWcC1YIkSvsNrGDntzlF7sQGVu8GJIHEfz66wdL6smmtJnCjfgbLD6wmKf+9xR/9vmTMgFlsjdQIUSusuvELoTI2MaN0K2bPj12bNauq2fEbDIzu+NsbsTf4InAJwj1C82+IIUQhpDELoSD+fNPaNNGn+7aFd5559H252n25Mfnf8RF2W2XGyHEA5D/yUI4kMRE6NcPrFbo0wcWLHi4Jvg7pU3qp66fYtRvo7BptkffsRAi10mNXQgHYjLBa6/BV1/B//0fuGTzn+YWm4U289tw6MohTt04xTcdvsHVRX5NCOFIpMYuhIPQND2Rv/qqPia8t3f2H8PVxZX/a/V/uJvcmbtvLl/t+ir7DyKEyFGS2IVwACdP6p3l1qzR57O7pp5Wi1IteK/BewAM+2kYW85sybmDCSFhpUsrAAAgAElEQVSynSR2IRzAm2/q96v/+GPuHO+9hu/xXIXniLfG8/q617HYLLlzYCHEI5PELoSdW74cVq3SO8n95z+5c0wX5cI3Hb4h0CuQvy7+xcjfRubOgYUQj0wSuxB2LCYmNZm//jqULJl7x/Zx92F2x9kU8i5Ezyo9c+/AQohHIt1dhbBjo0frD3apWBHGjcv947ct25Yjg47g6+Gb+wcXQjwUqbELYaf27IGJE/Um+FmzwM3NmDjSJvVtEduMCUIIkWWS2IWwU6NH609vGzIEatUyOhoYsGYA9b6tx4J/FhgdihDiHiSxC2Gn5s+HDz6Ajz82OhLdk0WeBKD/mv6cuHbC4GiEEJmRxC6EnfLxgTFjcmYgmofR58k+PFP+GW4l3KLnip4kWuVxykLYI0nsQtgRmw2+/BKio42O5G5KKb5u/zVB3kFsjdjKe7++Z3RIQogMSGIXwo5MmKDf1ta0qT6ErL0p4FmAZV2WYVImxm8bz/y/5xsdkhDiDpLYhbAT27fD8OH69BtvZM9T23JC/eL1+bDxhwB8uvVTGZVOCDsj97ELYQdsNnj5ZX3a319/zro9e6/he1QtXJUWpVrI09+EsDNSYxfCDnz9NRw+DMWKwfnz9ltbT6tt2baYTWYArsRcQbPHawdC5EGS2IUw2IkTMHSoPj1xInh4GBvPg4pOiKbh7IZ88ecXRocihEASuxCG++UXfUz4rl3tvwk+I9sitnHoyiGG/zycrWe2Gh2OEHmeJHYhDPbqq7B5M0yebHQkD6d5qeb0r96feGs87Re2l8FrhDCYJHYh7ED9+lCkiNFRPLzPW39Os8eacS3uGh0XdSTBmmB0SELkWVlK7EqpVkqpI0qp40qpEZmU6aKUOqiUOqCUksGkhbiP5cv1Znhn4GZyY1mXZZQuUJr9l/fzxvo3pDOdEAa5b2JXSpmAqUBroALQXSlV4Y4yZYB3gHqapj0BvJEDsQrhNK5fh/79oVkz+OMPo6PJHvnd8zOh+QQAvgr/iq0Rcr1dCCNk5QbUmsBxTdNOACilFgEdgYNpyrwKTNU07RqApmmXsztQIZzJe+9BZCQ0aKA3wzuLjuU68l2n7/Aye1G/uBOdmBAOJCuJvRgQkWb+LHDnQyTLAiiltgImYLSmaevv3JFSqi/QF6B48eIPE68QDm/TJpg2DcxmfVx4R7hn/UH0qNzD6BCEyNOyco09o187d148cwXKAI2B7sAspZTfXRtp2kxN08I0TQsLDAx80FiFcHiaBo0b69MjRkCVKoaGk+N+PfkrYzaNMToMIfKUrNTYzwIhaeaDgfMZlNmhaVoicFIpdQQ90e/KliiFcBLTp6dOv/WWcXHkhmux1+iwsAPRidG0Kt2KmsVqGh2SEHlCVmrsu4AySqmSSik3oBuw+o4yK4GnAJRSBdGb5uVmViHSsFr1JnjQR5jzu6tNy7n4e/rTt3pfADou6sjV2KsGRyRE3nDfxK5pmgUYBGwADgFLNE07oJQao5TqkFRsAxCllDoI/AYM0zQtKqeCFsIRmUzw558wf77z19aTfdzkY6oXqc7F2xd5/9f3jQ5HiDxBGXWvaVhYmBYeHm7IsYUQuWfH2R3U+7Yemqax6aVNNAhtYHRIQhhGKbVb07SwnDyGjDwnRC747ju4ds3oKIxRO7g279Z/Fw2N3qt6E50QbXRIQjg1SexC5LATJ6B3b6hYEeLjjY7GGB80+oDKhSqjoREVK1fphMhJWekVL4R4BO3agcWijzLn7m50NMZwM7mx6NlFBHgFEOQdZHQ4Qjg1SexC5KC1a+HQIX161ChjYzFa+cDy6eZjE2PxNHsaFI0Qzkua4oXIIdevQ9u2+vTo0fDYY4aGYzcu3b5El6VdaPFdC3lQjBA5QBK7EDmkTx/93cUF3n3X2FjsiYerB5tOb2LLmS0s+EceBClEdpPELkQOiI6GZcv06Zkz9XHhhc7Xw5dPmn4CwIhfRhCTGGNwREI4F0nsQuQAb28YMAAaNYJXXjE6GvvTq0ovqhWuxtmbZ5mwbYLR4QjhVCSxC5FDpk2D3383Ogr7ZHIxMbnlZAA+2/oZJ6+dNDgiIZyHJHYhslF8PDz9NCxaZHQk9q9RiUZ0rtCZmMQYBq4dKB3phMgmktiFyEb9+sGqVTBypNGROIaJLSYS5B1ExcCKWGwWo8MRwinIfexCZJO//4b//U+fnjzZ2FgcRXHf4px4/QTebt5GhyKE05AauxDZwGKBl1/Wp/v1S71/Xdxf2qR+7uY5AyMRwjlIYhciG0ycCLt3Q/HiMH680dE4pm0R2yg3tRw//fuT0aEI4dAksQvxiI4cSR0uduZM8PExNh5HtenUJm4n3KbXyl5ERkcaHY4QDksSuxCPaNo0vTf8Sy9By5ZGR+O4htUbRoPiDbhw+wJdv+8qnemEeEiS2IV4RJMnw/TpMGmS0ZE4NlcXV+Y/Mx8fNx9+O/Ub47aOMzokIRySJHYhHpGLi95hzt/f6EgcX4hvCIs7LwZgzKYx/HXhL4MjEsLxSGIX4iFYrdCgQeojWUX2aV2mNa9Ue4V4azx91/SVgWuEeEByH7sQD2H+fNiyBZ54Qr/VzUX+RM5Wn7f6nDhLHP3D+qOUMjocIRyKJHYhHtClS9Crlz796aeS1HOCt5s33z3zndFhCOGQ5FeSEA+oZEn93dUV3n7b2FjyikORh6RJXogsksQuxAOYOBFiY/Xp8HCprec0m2aj5XctqTCtAt/9LTV4IbJCfi0JkUUnT6bW0MeOhSpVjI0nL3BRLrQr0w6ANze8ybXYawZHJIT9k8QuRBYtXKi/16kD775rbCx5ycAaA6kdXJuo2CgGrxssTfJC3IckdiGyqF07+OgjWLnS6EjyFpOLiZntZuJt9mb+P/NZfGCx0SEJYdcksQtxH5akkU0rV4b334egIGPjyYsqFarEpJb60H6vr3udqJgogyMSwn5JYhfiHiwWaNYMhg3Tx4MXxunzZB8ahTYiMiaSLWe2GB2OEHZLErsQ9/Dxx7Bpkz4gzY0bRkeTt7koF75u/zWdK3Smw+MdjA5HCLsliV2ITGzapF9TVwq++06a4O1BmYAyLO68OGU0OulIJ8TdJLELkYErV6BHD7DZ9B7wTZoYHZFI5qL0X1sHIw9S99u6HIs6ZnBEQtgXSexC3EHT4OWX4dw5qFsXRo82OiKRkc+2fsaOszvo8n0X4ixxRocjhN2QxC7EHSZOhB9+AD8/WLBAHzpW2J8vW39JKf9S7L24l9fXvS7N8kIkkcQuxB169oSuXWHePAgNNToakZn87vlZ+txS3ExufL3na5YdWmZ0SELYBUnsQtwhKAgWLdIHpBH2rVqRaoxvPh6AV394lbM3zxockRDGy1JiV0q1UkodUUodV0qNuEe5zkopTSkVln0hCpE79u5NHYxGOI7BNQfTtkxbrsdd55XVr0iTvMjz7pvYlVImYCrQGqgAdFdKVcignA/wOvBndgcpRE47eBAaNNAf7HJNnjPiUJRSzOowi5J+Jen2RDejwxHCcFnpFlQTOK5p2gkApdQioCNw8I5yHwHjAHlCtXAoViv07g23b+uJ3d/f6IjEgyqcrzBHBh3BbDIbHYoQhstKU3wxICLN/NmkZSmUUtWAEE3T1txrR0qpvkqpcKVUeGRk5AMHK0ROGD8edu6EYsVg+nSjoxEPK21S/+P0H5y+ftrAaIQwTlYSu8pgWcpFLKWUCzAZGHq/HWmaNlPTtDBN08ICAwOzHqUQOeTvv2HUKH36m28gf35j4xGPbv3x9TSd25R2C9txK/6W0eEIkeuyktjPAiFp5oOB82nmfYCKwO9KqVNAbWC1dKAT9u7KFXj6aUhIgFdfhZYtjY5IZIfawbV5zP8x9l/ez8urX8am2YwOSYhclZXEvgsoo5QqqZRyA7oBq5NXapp2Q9O0gpqmldA0rQSwA+igaVp4jkQsRDaZOxdOnoTq1eHzz42ORmQXPw8/lj63FA9XD74/+D3DNg4zOiQhctV9E7umaRZgELABOAQs0TTtgFJqjFJKHrEkHNabb8K0abByJXh6Gh2NyE6VClVi6XNLMbuYmbRjEuuOrTM6JCFyjTLqns+wsDAtPFwq9SL3aZr+xDbh/D7b8hkjfhlBgGcABwYeoFC+QkaHJPI4pdRuTdNy9FK1jDwn8pQ//oAaNeDwYaMjEbnhrTpvUatYLbzdvImMkTtxRN4gj7cQeca5c9CpE0RFwezZ8NlnRkckcprZZGZF1xUopSicr7DR4QiRKySxizwhMRGCg/XpFi3gv/81Nh6Re4r4FEk3fzP+Jvnd5b5G4bykKV7kCW++mTr93XdgMhkXizBGvCWeAWsGUG1GNSKjpVleOC9J7MLp/ec/MHWqPr1hA8jYSHmTVbOyJWILJ66dYOwfY40OR4gcI4ldOLWzZ/UhYwHmzNGb4UXe5GX2YnbH2SgUX+78ks2nNxsdkhA5QhK7cGrBwTBrFnTvDr16GR2NMFpY0TDeqf8ONs3G88uel+e3C6ck97ELIfKURGsijeY0YvvZ7ZQNKMu2l7cR4BVgdFgij5D72IV4CHFx0LYt7N5tdCTCHplNZlZ1W8Vj/o9xNOqoXG8XTkdudxNORdNg0CBYuxYiImDfPhllTtwt0DuQdT3WsfzQcobWue+DKYVwKJLYhdPQNHjnHf3xqx4eemc5SeoiM2UDyjKi/gijwxAi20lTvHAao0bpo8m5usKCBfDkk0ZHJBzF0aijDPxxINfjrhsdihCPTGrswil8/TV89JE+PW+ePnSsEFlhsVnovKQz/1z+hzM3zrCq2ypMLjKCkXBcUmMXDu/mTejbV58ePRq6dTM0HOFgXF1cWdVtFX4efvx47EdG/jbS6JCEeCSS2IXDy58fVq2C117Tm+OFeFAl/Uuy8NmFAPx3y3+Zs3eOsQEJ8QgksQuHdfFi6nSHDjBlinGxCMfXqnQrPm/1OQD91vRj93m5X1I4JknswiHNng2PPQYbNxodiXAmg2sOZkDYABKsCXRb1o3ohGijQxLigUliFw7nyy/h5ZchNhb27jU6GuFMlFJMajmJ2sG1GdVoFF5mL6NDEuKBSa944VCmToXXX9enJ06Et94yNh7hfDxcPdj28jaUDIIgHJTU2IVD0DT44AN9VDnQE7wkdZFT0ib1307+xslrJw2MRogHI4ldOIQ33oCPPwaTSb9nfeBAoyMSecEfp/+g9fzW9FrZC6vNanQ4QmSJJHbhEDp3hgIFYOVK6NPH6GhEXlGuYDn8Pf3548wfvLVBmoiEY5DELuxWbGzqdIMGcOoUtGtnWDgiDwr0DmRx58W4urjyxc4vWH98vdEhCXFfktiFXdq5Ex5/HJYtS13m42NcPCLvahjakHfqvwPAC8tf4OLti/fZQghjSWIXdmfWLL2GHhGhX0/XNKMjEnndqEajaBTaiKjYKF794VU0+VIKOyaJXdiN+Hh9zPdXX4WEBH2I2NWr5dGrwngmFxMLn12It9mb8PPhXLh9weiQhMiU3Mcu7MLZs/Dss3oTvIcHTJ8OvXoZHZUQqYr4FGFZl2VUKlSJoj5FjQ5HiExJYheG0zR45hnYtQtCQ2H5cnmWurBPLUu3TDd/OfoyQd5BBkUjRMakKV4YTin46iu9x3t4uCR1Yf+iE6J5ccWLlP6iNL+e/NXocIRIRxK7MMSJEzBmTOp89erwww9QsKBxMQmRVR6uHlhsFm4l3KLVd61YeXil0SEJkUISu8hVFgtMngyVKunPTv/5Z6MjEuLBmVxMzH9mPkNqDSHRlshzS59j5u6ZRoclBCDX2EUu2rVLv40tPl6f79YNqlY1NiYhHpaLcmFyy8m4m9wZt20c/db0w8fNh+6VuhsdmsjjpMYuctyZM9CjB9SsqSf10FBYswYWLpSmd+HYlFJ81vwz3q7zNgA9lvdge8R2g6MSeZ3U2EWOmz4dFiwAFxdo3BhWrYJ8+YyOSojsM675OPK55eO3U78RVjTM6HBEHpelGrtSqpVS6ohS6rhSakQG699SSh1USv2tlPpFKRWa/aEKR6Fp+rjuyd55Rx945t9/4ZdfJKkL56OUYmSjkaztsRazyQwgo9MJw9w3sSulTMBUoDVQAeiulKpwR7G/gDBN0yoD3wPjsjtQ4Rh27oR69aBWLYiO1pf5+MCMGVCihKGhCZGjlFJ4mb0AuBl/kxdWvMDk7ZMlwYtcl5Uae03guKZpJzRNSwAWAR3TFtA07TdN02KSZncAwdkbprB3hw/D88/rCX170iXGQ4eMjUkIo8zaM4sF/yzgrY1vsWj/IqPDEXlMVhJ7MSAizfzZpGWZeQVYl9EKpVRfpVS4Uio8MjIy61EKu3XsGPTsCU88oXeGM5th+HA4fhzC5FKjyKPeqvMWY5uMBaD3qt4s+GeBwRGJvCQriT2jR3Bk2LaklHoBCAPGZ7Re07SZmqaFaZoWFhgYmPUohd3q0wfmzdM7xvXtqyf6Tz+VR6wKMbzecLo80YV4azw9lvfgq11fGR2SyCOyktjPAiFp5oOB83cWUko1A94DOmiaFp894Ql7cukSfPIJ/PNP6rL+/eHll+HoUf06eqh0mxQCSH0i3KAagwAYuHYgn235zOCoRF6QlcS+CyijlCqplHIDugGr0xZQSlUDZqAn9cvZH6Ywis2m92Tv0gWCg+Hdd2Hq1NT13bvDN99AyZLGxSiEvXJRLnzZ5ktmtJsBQKC3tFSKnHff+9g1TbMopQYBGwAT8K2maQeUUmOAcE3TVqM3vecDlir94dlnNE3rkINxixwWGQlz5sDMmfr1cgCTCTp2hM6dDQ1NCIfTt3pfKgRWoF5IvZRlmqaR9PtSiGyljLoVIywsTAsPDzfk2OL+Bg1KrZmHhOjX0l95BYrdq9ukECJLtkVs4z8//YfFnRdTLL/8p8pLlFK7NU3L0a7FMqRsHmezwbZt8PbbsCjNXTl9++qPUf3hBzh5EkaOlKQuRHbQNI23N77N1oitlJtaji1nthgdknAyUmPPg+LjYdMmfWjXVavg3Dl9ecOG+nIhRM66EnOFHst7sPHfjbiZ3Pik6Se8UfsNXJTUtZyd1NhFths/HgIDoWVLmDZNT+ohIfDGGzB2rNHRCZE3FPQqyNrn1/JajddIsCYwdONQhm0cZnRYwknIQ2CcVGysPgLcr79C69b6MK8ABQrArVtQuTJ06KC/wsJA+vAIkbtMLiamtJlCg+INeHHFi0zaMYkg7yCG1x9udGjCwUlidxIXLujXyrdu1V979oDFoq+7eTM1sXfuDE2ayO1pQtiLrhW7Em+NZ+CPA6lfvL7R4QgnIIndAdlscPCgPoxrck27TRvYuze1jIsLVK2qJ/Gnn05d7uurv4QQ9qNnlZ60Lt063X3uFpsFVxf5FS0enHxrHEBkJOzbpzetb9umv9+4oQ/fWrq0XqZVKyhYUK+ZJz9dLX9+Y+MWQmRd2qS+9MBSPtz0IfOfmU+VwlUMjEo4IknsduTqVT1hJzeTnzihJ+mLF+8uW7y43vEtObF/8knuxSmEyDlWm5VPtnzCgcgDVJ1RlZENRzK68WgZzEZkmdzuZoATJ+Cvv/Tx1ZNfR45AVFT6W87i4yFfPvDw0Du7Va+eWiMPlgfjCuG0rsdd54NfP2DqrqloaHR4vAOfNfuMcgXLGR2aeES5cbubJPYccPu2nrxPndJfx47BkCGptevXXtNvNbuTt7eetDdsSF0WEaEPDOMiNyYKkef8ePRHnl/+PDfjbwIwve10+lbvK7V3B5YbiV2a4h9QdLTeBH7unJ5sGzXSl1+5As2b64k4Kuru7Ro0SE3stWvD6dNQtiw8/rj+XrYsFC16921nISF370sIkTe0LduW/QP2M3TjUJYeXMrcv+fS58k+mJTJ6NCEHZMaOxATo3dQu3JFf69TJ7Xn+IwZsGIFnD2rJ/Pr11O3q11b78gGkJioN5nbbODuDiVKwGOP6dfCS5eG9u31JC6EEA9j3r551C9en5L+eiecm/E3yeeWT0arczBSY38IiYlw7Zr+iopKTdbBwfpoa6A/raxbt9R1MTHp97FlS+p934cOpW8ad3PT91WsmH47WTKzGXbt0mvdQUHSdC6EyF4vVnkxZdqm2ei4qCPnbp5jbJOxdK7QWZrnRQq7SuyaBnFx+rSnp/5+6RL8+ac+yMqNG6mv5OQ9Z45+bRr0EdbWr8943888k5rY3dxg9+7UdW5u+jCryS9399R1vXtDs2Z6Mg8OhoCAzEdpe/LJhz51IYTIsqNRRzkUeYhL0Zfo8n0XhtYZyvjm4yW5C8DApnh//zCtZMlwbt/Wr1snv1utMGoUjB6tl1uzRm/Gzszp03pzN8Czz8LKleDvD35+ehJOTta1akH//nq5xER9ZLaCBfV1Pj4ypKoQwrEkWBP48PcPGbdtHBabhRalWvB2nbdpXqq50aGJe3DqXvHu7mFaQsLd19jd3fVHiH78sT6/bx+8954+2Iqvr/7u56cn7wIF9Fq6j49eNi5O316StBAir1h6YCldvu+SMt/3yb7MaD/DwIjEvTh1Yq9QIUybOzecfPn0pvTkdzc3Q8IRQgiHdfbmWcZuHsuiA4tY12MdtYNrA/qz36V53r44dWK3p17xQgjhDBKtiZhNZkBP6s8tfQ6Ti4lJLSZRLH8xg6MTIL3ihRBCPIDkpA6w58Ielh1aBsDyQ8tpX7Y9HR7vQM8qPeUWOScnn64QQjih6kWrc+i1QzxX4TmsNisrDq+g96re1Py6JmuOrsFqsxodosghktiFEMJJlStYjiXPLeHMm2cY3Wg0RX2KsvvCbl794VWORh01OjyRQ+QauxBC5BHRCdFM2j6JLk904fGC+lCYey7swaRM8njYXJIb19ilxi6EEHmEt5s3HzT6ICWpA4z4eQRVZ1Sl3rf1WHZwGQnWBAMjFNlBErsQQuRRNs1GuYLl8DZ7sy1iG52XdiZkcgj/+ek/HIw8iFEtuuLRSFO8EELkcTfibjBn7xy+3vM1ByIPpCz//rnvebbCswZG5nykKV4IIUSO8/XwZUjtIfwz4B92vLKDV6q9QqBXII1KNEopM2bTGKbtmsaNuBsGRiqyQmrsQggh7mLTbCn3u8db4ikwrgAxiTGYXcy0LN2SNqXb0KZMG0L9Qg2O1LFIjV0IIYQh0g5io6ExpfUU6gTXIdGWyJqjaxi4diAlPi9BhakV2Hdxn4GRijtJYhdCCHFPHq4e9K7Wm22vbOPcW+eY1X4Wz5R/Bh83Hw5dOYSvh29K2XFbx/Hiihf59eSvWGwWA6POu6QpXgghxENJsCaw+/xuagXXwkW5EGeJo+jEolyLuwaAv4c/LUu3pGqhqpQPLE/t4NoEeQcZHLWx5CEwQgghHMqhyEMs+GcBSw8u5UjUkXTrJjSfwNC6QwHYe3EvW89spXxgecoXLE/hfIXzxJPo5CEwQgghHEr5wPJ81OQjPmryEUejjvLryV85fOUwByIPEFY0NZ/9ePRH3v/t/ZR5N5MbwfmDaVKiCa1Kt5Lb7B6BJHYhhBA5omxAWcoGlM1w3ZNFnuSVaq9w6Mohjlw5QlRsFCeuneDEtRNsO7stJbHbNBuVv6pMqF8o1QpXo3zB8pQqUIoAzwAKehXEz8MvT9T0H4QkdiGEELmudZnWtC7TOmU+JjGGg5EH2fjvRhSpifri7YsciDzAgcgDrD229q79rOm+hrZl2wL6uPcXbl2gXMFyhPiG4GZyy/kTsUOS2IUQQhjOy+xFWNGwdM31AEHeQfzd/2/2XNjD0aijHI46TMSNCKJio7h0+xJFfIqklJ25eyYzds9It321wtUI8AqgQfEGjGw0MmX5j0d/JJ9bPrzdvPEye+Ft9sbXwxdfd1+HbwHIUmJXSrUCPgdMwCxN0z69Y707MBeoDkQBXTVNO5W9oQohhMhrXF1cqVSoEpUKVbprnU2zpZuvGFSRp0o8xf7L+4mMiQTgr4t/pewnWWR0JO0WtsvwePnc8rGsyzJalGoBwLKDy1i4fyHuru64m9xxM7mlvAd6B/Kfev9J2faXE79gNpnxNntjNpkxu5hxM7lhNpnx9/DHx93n0X4YWXTfxK6UMgFTgebAWWCXUmq1pmkH0xR7BbimaVpppVQ34DOga04ELIQQQkD6QXQABtUcxKCagwCITYzl4u2LRMVGERUThYerR0q5G/E3aF26NbcSbhGTGEN0QjQxiTFcjb3K7YTb6f4I2BaxjWWHlmV4/JJ+JdMl9s5LO3M97nqGZT9t+inD6w9/6HN9EFmpsdcEjmuadgJAKbUI6AikTewdgdFJ098DU5RSSpNHAwkhhDCAp9mTkv4lKelf8q51pQuUZm2Pu6/Xa5rG9bjreLt5pyx7ofIL1AquRYI1gXhLvP5u1d/zueVLt3394vW5FnuNmMQYEm2JJFoTSbAmkGhLxM/DL/tPMhP3vY9dKdUZaKVpWp+k+ReBWpqmDUpTZn9SmbNJ8/8mlblyx776An2TZisC+7PrROxQQeDKfUs5Ljk/x+XM5wZyfo7O2c/vcU3TcrRNPis19ox6Edz510BWyqBp2kxgJoBSKjynb9I3kpyfY3Pm83PmcwM5P0eXF84vp4+RlbHizwIhaeaDgfOZlVFKuQK+wNXsCFAIIYQQWZeVxL4LKKOUKqmUcgO6AavvKLMa6JU03Rn4Va6vCyGEELnvvk3xmqZZlFKDgA3ot7t9q2naAaXUGCBc07TVwDfAPKXUcfSaercsHHvmI8TtCOT8HJszn58znxvI+Tk6Ob9HZNhDYIQQQgiR/eR57EIIIYQTkcQuhBBCOJFHSuxKqapKqR1Kqb1KqXClVM2k5Uop9YVS6rhS6m+l1JNptumllDqW9OqVZnl1pdQ/Sdt8oZIG61VKFVBK/ZRU/iellP/9jpGdlFKDlVJHlFIHlFLj0ix/J+nYR5RSLdMsb5W07LhSakSa5YY+hjwAAAnvSURBVCWVUn8mncfipI6IKKXck+aPJ60vcb9j5MA5vq2U0pRSBZPmneLzU0qNV0odTtr/CqWUX5p1TvP5PYjMzs8eKKVClFK/KaUOJf1/G5K0/IG/Q9n1Pc2h8zQppf5SSq1Jms+279aDfn9z4Nz8lFLfJ/2/O6SUquMsn59S6s2k7+V+pdRCpZSH3X52mqY99AvYCLROmm4D/J5meh36/e21gT+TlhcATiS9+ydN+yet2wnUSdpmXZr9jgNGJE2PAD671zGy8wU8BfwMuCfNByW9VwD2Ae5ASeBf9I6FpqTpxwC3pDIVkrZZAnRLmp4ODEiaHghMT5ruBiy+1zFy4BxD0DtGngYKOtnn1wJwTZr+LM2xnebze8CfR6bnZw8voAjwZNK0D3A06ef4QN+h7Pye5tB5vgUsANZk53frYb6/OXBu/wP6JE27AX7O8PkBxYCTgGean+dL9vrZPerJbkB/4AtAd2BB0vQMoHuackfQ/9N2B2akWT4jaVkR4HCa5SnlkrdN8x//yL2Okc0f5hKgWQbL3wHeuePnUCfpteHOcklfwiukJpmUcsnbJk27JpVTmR0jB/4jfg9UAU6Rmtid4vO74zw7AfOd7fN7wJ9BhudnZEz3iXcV+jMqHug7lJ3f0xw4p2DgF6AJsCY7v1sP8/3N5nPLj5781B3LHf7zQ0/sEeh/bLgmfXYt7fWze9Rr7G8A45VSEcCEpEDS/hCSnU1adq/lZzNYDlBI07QLAEnvQfc5RnYqCzRIagbZpJSqcZ9jZ7Y84P/bu//Yq6s6juPPV35FF+qCNKFZC1r2B7a0bIU2/AY0DRi0cpqtLfMvfy6qzS3ZTN2aTZfhslkbzcIwAoRogyIJMmyAhUnlivE1yVD8QYpoOBJ798c51++9l/vj+/ny+cL9fnw9ts++957P+dxzzvec+z33ns/5ngPsi4hDLfL6xjX5/Es5/oiXT9Jc4KmI2N50qir1V+8K0if8TmmPqvobhl7MU0t56PIcYCvF21CZ7bRsC4Hrgdq2ZGW2reG03zJNBp4H7sm3GhZJGksF6i8iniL1cU8Ce0h1sY0erbuh7O62HpjQ4tQCYAbwlYi4X9IlpP9nn0n7JWaLhnfM2jCuOfxFOpevjzQU9DHgI8AySZM7pN3qg1K38pX5OzlMl/LdQBquPuyygnnqyfqLiNU5zgLgELCkS9o9V38l68U8HUbSScD9wPyI2K/2e2MfjXZaGklzgOciYpuk/lpwhzwVLcdw2m+Z+oAPAddFxFZJd5KGxdsZNfWX79nPIw2f7wOWA5/qkJ9jWndDWaBmZrtzkhYDX85PlwOL8uN2y9DuBvqbwn+bw89oER/gWUkTI2KPpInAc13SKKRL+a4CVkYaA3lY0v9IGxR0SrtV+F7gbZL68iev+vi119qtxuV4R7R8kj5AaqTb8x/OM4BHlCZAVqL+IE3CAeYAM3I9dku7p+qvZL2YpwaSjid16ksiYmUOLtqGymynZTofmCtpFnAiaeh6IeW2raLtt0y7gd0RsTU/X0Hq2KtQfzOBJyLieQBJK4Hz6NW6O8L7Dn8D+vPjGcC2/Hg2jZMiHs7h40n3YMbl4wlgfD73hxy3NiliVg6/ncZJEbd1SqPk+ypXArfkx2eShkoETKFxAsQ/SJMf+vLjSQxOgJiSr19O4wSIq/Pja2icZLEsP26ZRtllrCvrLgbvsVel/i4ibS98WlN45epviL+PtuXrhSO3hcXAwqbwQm2ozHY6gmXtZ3DyXCltazjtdwTKtYm0exmkrbxvr0L9AR8FHgPemtP+MXBdr9bdkRb246T7DNtJ98I+XPcG/R5plt9fgHPrrrkCGMjHl+rCzyVt4/o4cBeDq+K9nTTZZGf+Ob5bGiVW5hjgJzlfjwDT684tyGnvIM/MzOGzSLN5HycNB9fCJ5NmdA7kiqrNtD8xPx/I5yd3S2OE3pC7GOzYq1J/A6QPY4/m4/tVrb8Cv5OW5euFg/T3JIA/19XZrOG0obLa6QiWtZ/Bjr20tlW0/Y5Auc4G/pjr8OekjrkS9QfcDPw9p38vqXPuybrzkrJmZmYV4pXnzMzMKsQdu5mZWYW4YzczM6sQd+xmZmYV4o7dzMysQtyxm5VMaae8bseuHPdHknZ3ecmjQtJNOW9dF64q8npDiNef0+0vI12zN7tS3sBm1mBq0/NVpLUebqoLO3jUcmNmbyru2M1KFhFb6p9LOgjsbQ4/UpJOiAh/QDCzBh6KN+sBks6RtEnSAUk7JV3ZdP7yPFw9TdJySftIqz3Wzl8g6TeSXpb0H0nrJJ3V9BoXSvq9pJckvSJph6QbW2RnkqQ1Oc4/Jd0o6S1Nr/V+Sask7ZP0qqQtki4aQjlPk3SfpP352sWkPbvNrCTu2M2OvVOA+0jLF88jrYd9t6RPtIi7hLR29sXknbMkzSYto/kK8AXg88DJwCZJ78pxJgO/IC0dfCkwF7gDGNsijVXABuDTpGVBbwa+WDsp6Z3AQ8AHgWuBS0g7Xq2R1GrHq3orSZvy3JDzcQj4bpdrzKwAD8WbHXsnkzZ22Agg6Xek7XQvAzY2xV0REdc3hd0JPBgR82oBkjaSNpX4GjCftJ3mGOCqiNifo21ok59vR8Q9+fF6SdNzXmphXyWtAT41IgZyemtJG+58k8F97xtI+iRpPfjLImJpDl4n6Zc07tplZkfA39jNjr0DtU4dIN833wm8u0XcVfVPJL0PeC+wRFJf7QAOAJuBaTnqo8BrwFJJF0t6R4f8rGl6/temvEwDttQ69Zzn14GfAmdLOqXN604FXidty1pvaYu4ZjZM7tjNjr0XW4QdJO0Q1WxP0/NaB/1DUsddf8wh7XpF7oQvJL3n7wWekbRV0gUt0nihS17Gt8gHwDOkHbvGtTgHMBF4MSJeawp/tk18MxsGD8WbjS7N/xf+7/zz68D6FvH/+8aFaVRgo6QTgPOBW0j3xd8TEXsL5OEFYEKL8Ak5f80fDGr2AOMkHd/UuZ9eIG0z68Idu9notoM0IW5KRHxrKBfkof4Nkk4CVgOTgCId+4PA/PyBYBeApONIk+H+FBEvt7luM3Ac8Fkah98/VyBtM+vCHbvZKBYRIekaYLWkMcAyUid9OnAe8GRE3JH/fW4asBb4F3Aq6Vv+06R76EV8B7gceEDSN4D9wNXAmcDsDnl9QNJDwA8knUqaR3ApcFa7a8ysON9jNxvlImItqdMeCywC1gG3kYbGN+do2/P5W4FfA3eR/m1uekS8WjC9p0mz2x8D7gZWkO67z46IX3W5/DOkDxe3Aj8jfbm4tkj6ZtaZIrou5WxmZmajhL+xm5mZVYg7djMzswpxx25mZlYh7tjNzMwqxB27mZlZhbhjNzMzqxB37GZmZhXijt3MzKxC/g9JXNDas9TdzQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_recall_vs_threshold(precisions,recalls,thresholds):\n",
    "    plt.plot(thresholds,precisions[:-1],'b--',label='Precision',linewidth=2)\n",
    "    plt.plot(thresholds,recalls[:-1],'g--',label='Recall',linewidth=2)\n",
    "    plt.xlabel(\"Threshold\",fontsize=16)\n",
    "    plt.legend(loc=\"upper left\",fontsize=16)\n",
    "    plt.ylim([0,1])\n",
    "plt.figure(figsize=(8,4))\n",
    "plot_precision_recall_vs_threshold(precisions,recalls,thresholds)\n",
    "plt.xlim([-800000,800000])\n",
    "plt.show()\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_pred_90=(y_scores>30000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8327904451682954"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_5,y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7074340527577938"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5,y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_vs_recall(precisions,recalls):\n",
    "    plt.plot(recalls,precisions,\"b-\",linewidth=2)\n",
    "    plt.xlabel(\"召回\",fontsize=16)\n",
    "    plt.ylabel(\"精度\",fontsize=16)\n",
    "    plt.axis([0,1,0,1])\n",
    "plt.figure(figsize=(8,6))\n",
    "plot_precision_vs_recall(precisions,recalls)\n",
    "plt.show()\n",
    "\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ROC"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 本质是真正类和假正类率FPR "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "fpr,tpr,thresholds=roc_curve(y_train_5,y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.rcParams['font.sans-serif']=['SimHei']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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YubMmVx++eX07t2bnJwczj33XKdLEhERF3HFRL7G3uhbazHGMHr0aGJiYvjzn/+M1+t1uiwREXEZV3T6jTXzA4EA9957L8OHD8daS8eOHbnpppsU+CIiUi9cEfqN0fbt2znnnHO48cYbCQQClJS47wwEERFpWNwR+o1sfH/hwoVkZGSwZMkSHnvsMf79738TH++uMxBERKThcccxfacLqIWioiLGjx9Ps2bNWLRoEd26dXO6JBERiRCuCP3GYNOmTbRp04aEhATeeustjj32WBISEpwuS0REIogrhvcb+uj+Cy+8QLdu3bj77rsB6N69uwJfRETCzhWh31AVFhYyceJERo4cSdeuXbnkkkucLklERCKYK0K/IV5a94svviArK4vZs2dzyy23sGTJEo455hinyxIRkQjmimP6DXF4v7i4mKKiIhYtWsTAgQOdLkdERMQdnX5DsXv3bmbPng1Ar169WLt2rQJfREQaDFeEfkNo9N9//3169OjB7373O3744QcAYmJinC1KRETkAO4IfQdT3+fzMX36dM4880zi4+P55JNPdOxeREQaJFcc03eKtZZf//rXvPnmm4wdO5aHH36Y5ORkp8sSERGplCtC36nZ+8YYLrnkEkaNGsXYsWMdqUFERKSmXBH64cz8kpISbrjhBjIzM5kwYQJjxowJ35uLiIgcAVcc0w+X1atX07t3bx566CG+++47p8sRERGpFVd0+vXd6Ftrefrpp7n22mtJSEjg9ddf55xzzqnndxUREalbruj0TT1P38/Ozubyyy+nd+/e5OTkKPBFRKRRckWnX1927txJeno6p5xyCgsWLGDw4MF4vV6nyxIRETks7uj063h/gUCAe+65h2OOOYbly5cDcNZZZynwRUSkUXNFp1+Xo/vbt29n3LhxLFy4kAsvvJDjjjuu7nYuIiLiIFd0+nVl4cKFZGRk8P777/PYY4/x0ksvkZaW5nRZIiIidUKd/gE++eQTmjdvzjvvvEPXrl3rZqciIiINRMR3+t9//z0fffQRAFOmTGH58uUKfBERcSVXhP7hLsM7b948evTowcSJE/H7/Xi9XuLj4+u4OhERkYbBHaFfy8wvLCzksssu45JLLqF79+4sWLBAM/NFRMT1XHFMvzZ27tzJGWecwbfffsuUKVO47bbbiIqKuI9BREQiUMSlXfPmzTnzzDN59NFHOfPMM50uR0REJGxcMrxf9fj+7t27GT16NN9//z3GGAW+iIhEJFeEflWWLFlCRkYGL7300v7V9URERCKRK0K/sj7f5/Mxffp0Bg4cSEJCAp9++ikjRowIe20iIiINhTtCv5LUnzVrFn/9618ZM2YMK1asIDMzM/yFiYiINCCum8hXUFBAUlISv//97zn22GO58MILnS5JRESkQXBHp4+hpKSEa665hl69elFYWEhiYqICX0RE5ABhD31jzFPGmE+MMVOOZJsDbVq/lt69e/Pwww8zbNgwnXcvIiJSibCGvjHmAsBrrT0N6GiM6XQ42xzIX5THdSOHsXXrVl5//XVmzZpFbGxs/fwAIiIijVi4O/0BwIuh2wuBvoe5zX6B4lw6n9STnJwczjnnnDoqU0RExH3CPQ6eCGwJ3d4DVDalvtptjDFXAleG7pbmLPvwy7Zt29ZxqXKQ5tH5Z5wAAAkfSURBVMAup4twOX3G9U+fcf3TZxweJxzOi8Id+gVAxWXskqh8pKHabay1jwOPAxhjsq21WXVfqhxIn3P902dc//QZ1z99xuFhjMk+nNeFe3h/BT8N12cAPxzmNiIiIlJL4e70XwE+MMa0Ac4GRhpjZlprp1SxzalhrlFERMSVwtrpW2vzCE7U+xQ401qbc1DgV7ZNbjW7fbweSpVf0udc//QZ1z99xvVPn3F4HNbnbKy1dV2IiIiINECuWJFPREREqtdoQr8+VvKTn6vu8zPGpBhj3jTGLDTGvGyMiQl3jW5Q03+nxpiWxpjPwlWXm9TiM37EGPOrcNXlJjX4fZFmjHnDGJNtjPlnuOtzi9DvgQ+qeD7aGPM/Y8xHxpjLqttfowj9+ljJT36uhp/faGCWtXYosA0YFs4a3aCW/07v46fTV6WGavoZG2POAFpZa/8X1gJdoIaf8VjgX6HT95KNMTqNr5aMMWnAXILr1xzKtcAKa20f4CJjTHJV+2wUoU89rOQnvzCAaj4/a+0j1tq3Q3fTgR3hKc1VBlCDf6fGmIFAIcEvV1I7A6jmMzbGRP//9u4+Rq6qjOP497fbpQuKFCEUYgrV1PBa3TbaAhpthaa8RClBQyrEFmOwBIECidImFTRRfEkaqwVDUTAERRS12MiLVFnBaFE0Vis1SLSktmjUWKG2tC59/OOc2b29md2Z2ZepM/P7JJPu3HvmzOnpdJ+559zzHOBOYJuki5rXtLYxj9qf438CZ0iaAkwDtjenaW3lFeBS4MURysxj6N/iCWDEL1etEvTLWfqmjrKMDa/u/pN0FnB0RGxqRsPaTM1+ztMmq4CbmtiudlLPZ/kDwDPA54A5kq5pUtvaRT19/FPgJOBaYGsuZw2IiBfrWMHWUOxrlaA/Lpn8bER19Z+k1wJfAmrOHVlV9fTzTcDtEbGraa1qL/X08SxgXUT8FbgXmN+ktrWLevr4ZmBZRHwS+ANwRZPa1mkain2tEhidyW/i1ey/fAX6bWBFRDzfvKa1lXo+p+cCV0vqB/okfaU5TWsb9fTxc8Ab8s9vAfx5bkw9fXw0MFNSNzAX8PrwidFQ7GuJdfqSXgM8CfyInMkPeF8xsU+VMmfWMSxiWZ19fBXwaWBzPvTliLi/2W1tZfX0c6l8f0TMa14LW1+dn+UjgbtIQ6E9wHsjYkeV6qyKOvt4DnA3aYj/58DFEbH7EDS35VV+D+R7fU6LiLWFcycBDwEbgbNJse+VYetqhaAPg3cxLgCeyENyoypjw3P/NYf7eeK5jyee+/j/R05b/3bg0VoXuy0T9M3MzGxsWmVO38zMzMbIQd/MzKxDOOib2YST1C1Jh7odZp3OQd+sTUhaJOnsYc71TuReCZIWSrqx8PxWSY8Winwc2JCXb9VT32U5CZSZjaNJh7oBZjZuVgE/lrSatC66YgUwHVgsKUgJPK6OiDsAJM0CXqb2OupuoBf4XUTsL537N7BS0nER8TFgH7A3138B8FHg/eWlRDkd7iRgX0QcKJz6ILAHeHehbDdwGHAgIvbVaKuZVeGgb9YGJJ0IzATeA8wB5kdEv6SvkQLqMmBZLttPyuJVsYkUpItB9zBSgC/m/O7Kx08mJ7ORNBkQ8AvgQmBNlQ0/bgCuiojKzoxdEfFyPncpsBbYK6kSyHtIX0AGJG0r1NMDHEHaiOhTdXWMmR3EQd+sPSwh7bS1I1/N1zJ4xR0Rk8snJS0FbomI6TXq+SxwXenY4BeFQlvOkXR3/vlBYFH++b785yMR8Y/8mvuAKblMH/DLiDiQd3K7kJQG2sxGwXP6Zi1O0iTgQ6Sr9YrHc8BdAvRK2ijpJUm7SEk8RtqqsxG3AMcAPREhYAbwAvAsKbifCnyfNL3QRRo9WFx4/eHAmcCzkhZIegA4npS3fSXwE+D8vE/408AJuQ4zGwVf6Zu1vitI8/RF8yOiv/JE0hrS8P2+qJKRS9J1wJ6IuLORNy5uCpRThH4jP14ibWqzm/QFYwtwY0SsK71+N/ARSeuA/cAlpJGCx0hfCC6OiB/k+w6WRMT6RtpnZgfzlb5ZC8tz+Z8Bbh/mfK+k40hbyS4GlkhaKumMUtEFwDtKx7okTSk8jpV0QpX3eHMekt8A3BoRN5Dm/idHxF9y3TcDt0nakNtT9h9gF+m+hHeR7hO4HHidpNmkvdlneNmf2dg46Ju1tp2kgPqr0vHK8P5eYBrweeAy0jz5auCNpfIDFOb5s2nAvwqPvwMPFwtIeivwa9INdn0RsabQrl2SuiNZTdqY5URKv3cknQ88BZxDGhV4kHT3/neAhaSNcaaTViE8IOmIWp1iZtU56Ju1sIgYKO64VTA/z7EfTgrKDwFrI2IRaRj96Tqqfz4iVHmQ7p4v5wHYApweERdFxB9L5+ZQWBEQERvzscGVA5JWAveQRiK2knZjOxL4ImkZ4FzgdGA2aQvcN5Hu+DezUfCcvlmbykPhleHwjcB5kn5Lmrvf3mh9ETFAGhEoehh45wij7geGOSdJXcA3gW9FxHP54FzSfuBfBf4UEcvzFq3bI+IFSX1A5BGEYbcPNbPqHPTN2tPjhZ9fD3yXlBUvgNvG8X0uyHUOJteRdDLwG2AHsCEirq8Uzuv0K0sEZ5KmJfZLKif7eRXpC8PSwmthKFfAQtKd/WbWAAd9s/ZUSc7TAwxEREj6IWmu/PjxepOI2FN8nvf1/jppyP4TwM/yiMOKiNibM/ntz6/dzDC/gyStB7ZFxPLxaquZeU7frF10M/T/uadyMCL+C7xa0irgPGAzcJekqXkTnD5Jp5KW/B0l6RRJp5DWw/dUnufHabn8jPKbSzpG0vWkK/ytwLURsRM4izQXv0XSNZKOmrguMLNafKVv1h56GUpaM5hhL2/A8wjpjvjZpLvwvwA8Q7op7ikOzru/qVRv+XlPru+SXP9y0lLAWcDvgQ9HxPcqhfM8/DzgSlIin9WS7o+Iy2v8fYpfYsxsnKhKng4zayOSpkbE30rHjq2kvR1j3W8DzgXW5+H6kcpOJi0Z3BkRT9Yo+xjw54i4cqxtNLMhDvpmZmYdwsNnZmZmHcJB38zMrEM46JuZmXUIB30zM7MO4aBvZmbWIRz0zczMOsT/AEHhzxUASbFPAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_roc_curve(fpr,tpr,label=None):\n",
    "    plt.plot(fpr,tpr,linewidth=2,label=label)\n",
    "    plt.plot([0,1],[0,1],'k--')\n",
    "    plt.axis([0,1,0,1])\n",
    "    plt.xlabel('假正类率',fontsize=16)\n",
    "    plt.ylabel('真正类率',fontsize=16)\n",
    "plt.figure(figsize=(8,6))\n",
    "plot_roc_curve(fpr,tpr)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 随机森林分类器 比较SGD分类器的ROC曲线和ROC AUC分数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 获取训练集中每个实例个数\n",
    "## RandomForestClassifier 没有descision_function 但是有dict_proda方法\n",
    "## 返回一个矩阵，每行一个实例，每列代表一个类别概率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf=RandomForestClassifier(n_estimators=10,random_state=42)\n",
    "y_probas_forest=cross_val_predict(forest_clf,x_train,y_train_5,cv=3,method=\"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       ...,\n",
       "       [1. , 0. ],\n",
       "       [0.1, 0.9],\n",
       "       [1. , 0. ]])"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_probas_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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NWvtXmvtW9babXm1zxP19PfuhY0b8+poIiJFT0JCArfeeiv/+te/aNy4MY8//rjXkeQU+OJq9WInmMjXty80agTDhgUpkIiIj/z44480aNCAt99+m9GjRzN37lyqVavmdSw5BT5Ze//4PX1rYedO2Lo1SIFERHykUqVKVK5cmenTp9O0aVOv48hp8ElP//hFf/p0+P57d8meiIic2Pbt2xkwYACpqalUrFiRb775RgXfB3xR9E/U0y9eHOrXB106KiJyYnPmzKFevXq88MILrFixAkAr6/mEL4p+btfeFxGRYzt8+DADBgygTZs2VKxYkWXLlhETE+N1LMlDvij6x1uR7+OPXS9/xIjg5RERKYx69erFuHHj6Nu3L0uXLuVi3ajEd3wxke945/QXL4b4eGjWLIiBREQKkbS0NEJDQ3nwwQe56aabuPnmm72OJPnEF0X/eOf0H3oIunfX+XwRkewSExO59957CQ8PZ8KECTRo0IAGDRp4HUvykS+G94/X0y9bFi68EKpXD2IgEZECLj4+nujoaCZPnkyFChWw9oS3OREf8EXRz83a+yIi4pbSHT9+PI0bNyYhIYF58+bx6KOPanZ+EeHror9hA7RpAwMGBDmQiEgBtWXLFgYOHEjLli2Jj4+nRYsWXkeSIPLFOf2QY3xCjYuDOXPg0KEgBxIRKWB++OEHLrroIs466yyWLl3KhRdeqN59EeSLnv6x/t1edRXMng09egQ1johIgZGamsqIESOIiopixowZANSpU0cFv4jyRU/fkPM/3ooVoXlzCAsLciARkQJg8+bNdO3ala+++opu3bpx4403eh1JPOaPon+MD6zWuiV4RUSKmk8++YTu3buTnJzMtGnT6Natm9eRpADwR9E/Rvvjj0N6OvTsCboLpIgUNbVq1eKNN96gdu3aXkeRAsLX5/QHDoTBg2H//uDmERHxwpo1a5g8eTIA1113HUuWLFHBlyP4pOgfXfXT0uCdd9zyu+ee60EoEZEgsdYyadIkoqOjGTx4MAcOHAAgNDTU42RS0Pik6B/dFhoKHTrArFmayCci/pWQkECXLl244447uOyyy4iLi6NUqVJex5ICyifn9I+u+gcPQng4VK3qQSARkSBITk4mJiaG9evXM2bMGAYMGKDevRyXP4p+Dj39Pn2gYUPo2hUqVQp+JhGR/GKtxRhDREQE999/P/Xq1aNp06Zex5JCwB/D+zm0vf46PPAA7N4d9DgiIvlm27ZttGvXjs8++wyAO++8UwVfcs0fRT+Hqv/f/0L79qCJqyLiF3PmzCEqKopFixaxa9cur+NIIeSPop9DX79PH/joIyjmixMYIlKUHT58mAEDBtCmTRsqVqxIXFycFtuRU+KPoq8lpEXExz744APGjRvHnXfeybJly7jooou8jiSFlC/6wdlr/tixEBHhLtmrVcuTSCIip23Tpk3UqFGDW265hW+++Ubn7uW0+aSnf2TZ//xzePBBWLzYo0AiIqchMTGR22+/nYsuuogNGzZsXt7uAAAgAElEQVRgjFHBlzzhj55+tq5+jx5QsyY0aeJNHhGRU7Vy5UpiY2P5+eefGTRoEGeffbbXkcRH/FH0sw3w9+rlvkRECpPx48fz4IMPcsYZZzBv3jxatGjhdSTxGZ8M73udQETk9K1evZpWrVoRHx+vgi/5wic9/Uz79sGKFVCjhm60IyIF36JFiyhTpgyXXnopL7zwAmFhYTneREwkL/iup//xx3D11XDbbd7lERE5kdTUVIYPH06LFi0YMmQIAOHh4Sr4kq/80dPP8p+kfn1o2xYSEz0MJCJyHJs3b6Zr16589dVXdO/enfHjx3sdSYoIXxT9rOrWhQ8/hBBfjGGIiN/88MMPNGvWjJSUFKZPn85tGpaUIPJFacw+GhYWBrq7pIgURBdeeCGdO3dmxYoVKvgSdL4o+iFZqv6uXW4yX3q6h4FERLJYs2YN7dq1Y9euXRQrVowJEyZQW3cDEw/4ouhn7ehfey2ULQvLlnkWR0QEcPe9nzRpEtHR0Sxfvpz169d7HUmKOH8U/SxVPyICSpSAChW8yyMikpCQQJcuXbjjjjto0qQJ8fHxNG7c2OtYUsT5YiJf1hX5vvrKfbfWozAiIkD//v353//+x5gxY3jooYcI0exiKQD8UfRzuKxVl7qKSLClp6eTkJBA+fLlefTRR+nVqxdNdBMQKUB8UfRFRLy2bds2unfvzsGDB1m4cCEVK1akYsWKXscSOYIvxpsyFud57z0oXhzuv9/jQCJSpHz++edERUX9vdhOqK4ZlgLKH0U/8H33bkhOhiVLPI0jIkXE4cOH6d+/P23btqVSpUrExcXRp08fLaUrBZYvhvdDAv+/unSBRo1cb19EJL8lJyfz/vvvc+edd/L0009TokQJryOJHJcvin7Gp+rISIiK8jiMiPjeBx98QOvWrSldujTLly+nTJkyXkcSyRV/DO8Hevr797vhfRGR/HDgwAF69erFjTfeyIsvvgiggi+Fii96+hlGjHDX599+O1x8sddpRMRPVq5cSefOnfnll18YOnQo9913n9eRRE6aL3r6GZYtg2eegT/+8DqJiPjJm2++SePGjTlw4ADz589n5MiRFCvmqz6TFBG++FebMU/2gQfgppt0Xl9E8laDBg3o0KED48eP58wzz/Q6jsgp80XRz3DjjV4nEBG/WLRoEe+88w7PPfcctWvXZtasWV5HEjlt/hje1zWxIpJHUlNTGT58OC1atGD27Nns3r3b60giecYfRR84cAAGD4a5c71OIiKF1ebNm7n66qsZOXIk3bp1Y8WKFRrOF1/xzfD++vUwZgxMnAg7d3qdRkQKm7S0NK655hq2bt3KjBkz6Nq1q9eRRPKcL4q+AUqXhltvhfR0r9OISGFy6NAhwsLCCA0NZeLEiVSvXp3zzjvP61gi+cI3w/vnnguvvw5vvOF1EhEpLNasWUNMTAzjxo0DoHnz5ir44mu+KfoiIrllreXVV1+lYcOGbNu2jShd5ytFRNCLvjFmkjHmW2PMkBNs95Ix5vrc7RP27nWL8iQl5U1OEfGnhIQEunTpQu/evWnatCnx8fG0a9fO61giQRHUom+MuQkItdY2Ac41xtQ+xnZXAlWstR/ldt/33ANnnw2PPppHYUXEl3766Sfef/99xowZw5w5c6hatarXkUSCJtg9/auAtwKP5wBXZN/AGBMGvAL8boy5ITc7NRjq1oUSJSAtLa+iiohfpKens2DBAgCaNGnC77//zsCBAwkJ0RlOKVqC/S8+EtgSeLwHqJzDNt2Bn4AngBhjzD3ZNzDG9DHGxBlj4jLaBg2Cgwdh7Nh8SC0ihdaff/5J69atadmyJcuXLwegSpUqHqcS8Uawi/4BoETgcaljHP9SYKK1dhswA7g6+wbW2onW2mhrbXS+JRWRQm/27NlERUWxePFiXnnlFRo0aOB1JBFPBbvoLydzSD8K+D2HbX4Fzg08jgY2nminWoVXRLIbMmQI7dq1o0qVKsTFxXHHHXdg9GYhRdxpF31jTEhg4l1uvA90M8Y8DXQCfjTGjM62zSTgamPMl0A/4Mnc7Pjyy+H88+Gnn3KbXET87Oyzz6Zfv34sWbKEunXreh1HpEA44Yp8xphw4EHgMaC4tTYp0F4c6IybmPc5UPJE+7LW7jPGXAW0Ap4IDOHHZ9tmP9DxZF6EAZYs0SQ+kaJu5syZhIaG0rlzZ/r27et1HJECJzc9/RCgP3APMCxL+wxgEK7mpuT2gNbavdbatwIFP89s3gxvvQVaTEuk6Dlw4AA9e/aka9euTJ06FWut15FECqTcrL1/GEgEPgXijDHfArVxl981tNYeNMZ43seuWhU6ntT4gIj4wffff09sbCy//PILQ4cOZdiwYTp3L3IMJyz61tp0Y0yKtfZXY8z9wCbge2ApcIMx5q3j7yH/GQMbN0LNml4nEZFg+u2337jsssuoWLEiCxYs4KqrrvI6kkiBdrIT+bZZa1cCZwLPA+OAs/M81Unatw/+8x/o39/rJCISDKmpqQCce+65PPfcc6xcuVIFXyQXcl30jTExwDvGmLa4S+l+A7Zba5fhzut7JjHR8MEH8GSu5vmLSGG2cOFCzj//fL7//nsA7rzzTs4880yPU4kUDsct+saYy4wxHwR+/B7Xs38ft5peR6B84PK7EsaYpwNfzxpjXs7X1NmULQuTJum2uiJ+lpqayrBhw2jRogVhYWFaQlfkFJzonP65uKVzw4D3gBHAf3DX0ltgH/AP3IeHWoHnhALF8yHrMUWWhE63B/OIIhJMmzZtomvXrnz99df07NmTF154gVKlSnkdS6TQOW7Rt9bOBGYaY/7AFfjHccW+JfAB7tr8fwG/WGs75HPWY9NEXRFfmzx5MvHx8cyYMYOuXbt6HUek0Mrt+Nhha+2twF6gLHAIuAUoA9TEfRDwzK6d8PbbELiXhoj4QFJSEj8FltgcNGgQq1atUsEXOU0ne1LsZaAOsBs39B9trfW81K5dC506wfjxXicRkbzw008/0bhxY1q3bk1SUhJhYWGcc845XscSKfROWPSNW+UiwhhTAZiFO78fibtkr1L+xsudM86Am2+GRo28TiIip8Nay8SJE4mOjmb79u28+uqrlChR4sRPFJFcyc2KfBG4c/dtgTestT8AGGO6A9OMMU2B8PyLeGJ168Lw7l4mEJHTlZSURI8ePXj77be55pprmD59uu57L5LHcjO8nwrcjevlP5zRaK39DHgWSMd9MPCMltwUKfwiIiJITk7mscce4/PPP1fBF8kHuVmGNxV4PfBjYrbfjQ0M/zfMh2y5lnIYDh6E4sVBl+6KFB7p6ek8/fTTdOrUiRo1avD+++/rQ7xIPjrtEmmdVXkR5lRNmACRkfDUU16mEJGT8eeff9K6dWv69+/P1KlTAY3aieS3XBV9Y0yEMeZdY0xE4OczjTGVjDGRxpg0Y0xklm2nGWMuz6/AOalc2X1PSAjmUUXkVH322WdERUWxePFiXnnlFYYMGeJ1JJEi4UTL8GZ87E4Hbgh8B3gN+BxIwS2NkxzYvgwQC1TLj7DHEhsLyckwalQwjyoip2LWrFlce+21VKlShbi4OO644w718EWC5EQ9/Q+MMf+01qYAWGtTjDG9cTP5H7TWHnbNNjWwfXfcAj7v51viHBgD4eHuu4gUTNa6Nbyuu+46hg0bxpIlS6hbt67HqUSKlmMWfWNMCO4mO28ELs/DGHM28BQwwFq7INv2xYH7gOEZHxJERABmzJjBFVdcQVJSEqVLl+aRRx7R9fciHjhm0bfWpltrh+Puptct0Pw8sMRa+2wOTxkL/AlMzPOUJ/DSS3DFFbB6dbCPLCLHc+DAAXr27Em3bt0ICQlh//79XkcSKdJyc8nep8Cnxph04CHgALjz/daN1xljzFPAjcBl1tr0Y+8tf3z/PexZAfv2BfvIInIs33//PbGxsfz6668MGzaMoUOHUqxYbtYDE5H8ctz/gcaY2cDBwI8WeAwICczi/8sYExP43fVAE2vt9nxLehyPPAIhm6BePS+OLiLZWWvp168fiYmJLFiwgObNm3sdSUQ4cU9/BYGZ+biefB3gTdyyu1uBxcBzwFnAMGPMf7w4n39WdcON7YN9VBHJbteuXRQrVoxy5coxc+ZMSpcuzZlnnul1LBEJOO7sfWvtIGvtI7jJe+BupVsq0D7eWvsCbgSgPtAIeCVf04pIgfXFF19Qr1497r77bgBq1aqlgi9SwOTmLntjgXm44n4l0NUYc3fWbay1P+Ou429njPlnfgQ9nnfegTFjIC0t2EcWkdTUVIYOHUrLli0pU6YM//d//+d1JBE5BpNx7WyOvzTmAWAg0B5YbK0NNca0AD4Aoqy1vxlj0q21IYHt7wdus9YGbS3+iKq1bbHyC0laW520NF2rLxJMmzdvJjY2lsWLF9OrVy9eeOEFIiMjT/xEETktxpjl1trok33eic7p/4Ar+EsDBwmx1i4wxnwMPAnclG37qcBjxpiLM27BGww33ggldqjgiwRbSEgI27ZtY+bMmXTp0sXrOCJyAsct+tbaOeDW3sctt1sG+As3i3+5MeaCjN9ba5OttXuMMd8DHXAfGIKiU0e4LKgL/4oUXUlJSbzyyivcfffdVK9enbVr1xIWFuZ1LBHJhdzeZc/iZumnA1hr44HLgI3AItwHggxvAPPzMGOuZNx0R0Tyz48//khMTAz/+c9/WLhwIYAKvkghkquib609bK2931q7L0tbnLX2kLX2amvtoSztz1lrF+dH2GOZvwB++imYRxQpWqy1TJw4kUaNGrFjxw5mz55NixYtvI4lIicptz39Am3SJMNFF3mdQsS/7r//fvr27cvll19OfHw8bdq08TqSiJyCE66JaYwpBlS11m7Oxbb/AB6z1nbMi3C5dd55cFH9YB5RpGjp2LEjVatWpX///oSE+KKvIFIkHfeSPQBjTAPga2ttySxtVYBPgaZZh/aNMVGBbUvnU96jRFStbd+evYh/Rmkmn0heSUtL4/HHH2ffvn089thjXscRkWxO9ZK93HxkPwRkX1o3BYgCDmdrP5zDtiJSiGzdupXWrVszePBgNm7cSHp60O+hJSL5JDdFPy3wlVUquNvvZmvXu4NIIfbpp58SFRXFt99+y6uvvsrMmTM1nC/iI77439ylC9xyi9cpRAq3HTt2cMstt1CtWjWWL1/Ov/71L4xWvBLxFd/c3Prbb71OIFI4bd++ncqVK1OpUiVmz55NTEwMxYsX9zqWiOSD3Pb0yxpjfsv4AuIBk7Ut0D4v/6Ie28T/wurVXhxZpHCbMWMG5513Hm+88QYAzZo1U8EX8bHc9vQPAY/kYrtqQP9Tj3NqSpeBChWCfVSRwmv//v3cfffdTJs2jSuvvJIrrrjC60giEgS5LfrJ1tqpJ9oosBZ/0Iu+iOTeihUriI2NZf369YwYMYLBgwdTrJhvzvSJyHH44n/6iy/CnqbQs6fXSUQKvvXr15OUlMQXX3xBs2bNvI4jIkF00kXfGHMHcCVHX8YHUPa0E52Cr7+GfxRT0Rc5lp07d/Ldd99x/fXX07FjR6699lrd916kCMpN0TccOeGvJFCBwLX62ZTKi1Anq9+/4eZGXhxZpOD74osv6Nq1K4mJiWzcuJFy5cqp4IsUUbkp+sUDXwBYa58Hns9pQ2NMHSCod9gDuLIZXBYV7KOKFGypqamMGDGCMWPGcP755/Ppp59Srlw5r2OJiIdOWPSttSvJUvRPIBwocVqJROS0paSk0KJFC77++mtuv/12nn/+efXuRSRvVuQzxtQzxoQCq4HKebHPk/Hdt/DDD8E+qkjBFRYWRtu2bZk5cyaTJk1SwRcRIBdF3xjT2BhzzO0Cxf57oCIQClTNu3i589zzMGtWsI8qUrAkJSXRr18/Fi5cCMDgwYPp0qWLt6FEpEDJTU//DY4zvG+tTcNN9ksGbgPmBT4IBE2jaCjryXUDIgXDjz/+SExMDBMmTGDJkiVexxGRAio3E/kOA8nGmBGBn3O6k57FXcJ3H/C/wAeBoOnXT7P3pWiy1vLKK69w3333Ubp0aWbPnk2bNm28jiUiBVRuin5Gkf8PsAq4AvgOuAz4hczr9S8B/gG0yOOMJ1SiBIQGdWxBpGD48MMP6du3L61atWLatGlUqVLF60giUoCdzEQ+C7TGDeXfFPj+NDAy8PhG4E1r7e68Dnki+/ZBWlDHFkS8tX//fgCuv/56Zs2axezZs1XwReSETmX2vg18ZW97GXjqtBOdgj594ClPjiwSXGlpaTz66KP84x//YNOmTYSEhNC5c2dCQvLkQhwR8bljDu8HZuy/glt9rxluZv7fv87hKTuttfvyNl7uhIVB7dpeHFkkeLZu3cptt93GF198QZcuXSir2asicpKOd04/DHer3FLAp7iFdwqk6dPheq3IJz72ySef0LNnTw4ePMhrr71Gz549MSanz94iIsd2zDFBa22ytbYdsAlX+BNOsK8LjTEd8zKciDizZs2iWrVqLF++nF69eqngi8gpye1d9uwxvmfVCugJvH2amUQE+OWXX0hPT+eCCy5gwoQJFCtWjOLFc7sitojI0XI7+8cEvpYEvs8LtA8GHgs8fgUIN8a0y9OEuTB8OPz0U7CPKpJ/pk+fToMGDbjzzjsBKFWqlAq+iJy2k+npjw48npLtdwY3a/8Q8AzQG/jsWDsyxkwC6gKfWGtHH2e7ysBsa+2lJwq3bh0kJZ1oK5GCb//+/dx1111Mnz6dZs2aMW3aNK8jiYiP5KbohwPFrbU5XhRn3MnFp3Cz+6cBw40xYdbalBy2vQkItdY2Mca8Zoypba395RjHfZJc3rHvkUfgggtys6VIwbVhwwZat27Nb7/9xogRIxgyZAihWnVKRPJQbor+i2SuupeT4rjefoS1dpsxpkVOBT/gKuCtwOM5uNX9jir6xpgWQCKwLRf5uOACKFUqN1uKFFzVqlWjTp06TJo0iWbNmnkdR0R86ITn9K21z1hrk4/z+ySgFrA98PP3x9ldJLAl8HgPOdyG1xgTDgwFHj7WTowxfYwxccaYuBPlFynIdu7cSd++fUlISCAiIoIPP/xQBV9E8k2eLONlrd1orc1pRn92B8gcsi91jOM/DLxkrf3rOMebaK2NttZGA7z/Pvx1zK1FCqYFCxYQFRXFlClT+O6777yOIyJFQLDX7lyOG9IHiAJ+z2Gba4C7jDELgfrGmFdPtNNZsyDhRKsIiBQQqampDB48mGuuuYYyZcqwdOlS3RlPRIIit7P388r7wFfGmGpAOyDWGDPaWjskYwNr7d9jm8aYhdbaO0600xtuAK1IKoXFgAEDeOaZZ7j99tt5/vnniYyM9DqSiBQRJnej8nl4QGPK4xby+dJam6uJescTUbW2fefzRbSvV+30w4nko8OHDxMeHs6WLVv4+uuv6dy5s9eRRKSQMsYszzjFfTKCfmsua+1ea+1beVHwRQqDgwcP0rdvX9q3b096ejrVq1dXwRcRT/jifpybNkFqqtcpRI72ww8/EBMTw8SJE2nQoAHp6eleRxKRIswXRb9/f9i/3+sUIpmstbz88ss0atSIXbt2MWfOHB577DGKFQv2NBoRkUy+KPpnnw16L5WC5MCBA4wZM4bmzZsTHx9Pq1atvI4kIhL02fv54sknoXRpr1OIwPLly7nkkksoXbo033zzDdWrVyckxBefrUXEB/RuJJIH0tLSePTRR2ncuDHjxo0D4Oyzz1bBF5ECxRc9fREvbd26ldtuu40vvviCLl26cM8993gdSUQkR77ohtzVD4K83IAIkLmU7pIlS3jttdd4/fXXKVOmjNexRERy5Iue/u49YIzXKaQoqlixIueddx6TJ0/mwgsv9DqOiMhx+aKnP3681wmkKPn5558ZO3YsAJdccgmLFy9WwReRQsEXRf/MM71OIEXFtGnTaNCgAU8++SRbt24FwGiYSUQKCV8UfZH8tn//frp160aPHj1o2LAh8fHxVKum+z2ISOHii6I/Y4bXCcTPrLW0aNGCmTNnMmLECBYsWMBZZ53ldSwRkZPmi4l8c+d6nUD8KD09HWMMxhiGDh1KuXLlaNas2YmfKCJSQPmip9+ypdcJxG927NhB+/btGR+YJfrPf/5TBV9ECj1fFP3u3b1OIH4yf/58oqKiWLBgAeHh4V7HERHJM74o+iJ5ISUlhUGDBtGqVSvKly/P0qVL6du3r9exRETyjC+K/o8/6JIpOX1xcXE89thj/Otf/2LZsmXUq1fP60giInnK2EK+fm1E1dr2rAu+ZP3Cql5HkUJqzZo11KlTB4DVq1dzySWXeJxIROT4jDHLrbXRJ/s8X/T09R4tp+LgwYP07duXiy++mCVLlgCo4IuIr/nikr3evb1OIIXNDz/8QGxsLD/++CMPPfQQDRo08DqSiEi+80XRFzkZr776Kvfccw9ly5Zlzpw5tGrVyutIIiJB4Yvh/cI9K0GCLSEhgebNmxMfH6+CLyJFii8m8lU+90s2faOJfHJs33zzDfv376dt27akp6cDEBLii8+8IlIEFemJfIX8c4vko7S0NEaPHk3z5s0ZOnQo1lpCQkJU8EWkSPLFO9/LL3udQAqiLVu2cM011zB06FA6derE/PnzdRtcESnSNJFPfGnLli1ERUWRlJTE5MmT6dGjhwq+iBR5KvriK9ZajDFUq1aNu+++m9jYWC688EKvY4mIFAi+GN5//XWvE0hB8PPPP9OsWTPWrFmDMYYRI0ao4IuIZOGLov/rr14nEC9Za5k6dSoNGjTgp59+YuvWrV5HEhEpkHxR9G+91esE4pX9+/fTrVs3evbsSXR0NKtWraJly5ZexxIRKZB8UfRr1/Y6gXjlmWee4Y033mDkyJHMnz+f6tWrex1JRKTA0kQ+KXTS09PZtm0b1apV46GHHqJt27bExMR4HUtEpMDzRU9/+QqvE0iw7Nixg/bt23P55Zdz4MABIiIiVPBFRHLJF0X/89leJ5BgmD9/PlFRUSxYsID+/fsTGRnpdSQRkULFF0Vfd0X1t9TUVAYNGkSrVq0oX748S5cupV+/flpsR0TkJPmi6Ldr53UCyU/GGBYvXswdd9zBsmXLqFevnteRREQKJU3kkwLr3XffpWnTplSpUoXZs2dTvHhxryOJiBRqvujp6y57/nLw4EH69OnDzTffzLhx4wBU8EVE8oAviv5LL3mdQPLK6tWradSoEa+++ioPP/wwjz32mNeRRER8wxfD+2FhXieQvDB79mw6dOhA2bJl+fzzz2nVqpXXkUREfMUXPf0+fbxOIHkhJiaG2NhY4uPjVfBFRPKBL4q+FF5ff/01t9xyC4cPH6ZChQpMnjyZypUrex1LRMSXVPTFE2lpaYwaNYrmzZuzcuVKtmzZ4nUkERHf80XRnzXL6wRyMrZs2cI111zDsGHDiI2NZcWKFdSqVcvrWCIivueLiXy7d3udQE5Gly5dWLFiBVOmTKF79+5aWU9EJEh8UfQ7d/Y6gZxIcnIyaWlplCxZkpdffpnQ0FAuuOACr2OJiBQpvhjeP/NMrxPI8axbt47LLruMe+65B4C6deuq4IuIeMAXRV8KJmstU6ZMoWHDhmzevJkOHTp4HUlEpEjzRdFftszrBJLdvn37uO222+jVqxeNGjUiPj6e9u3bex1LRKRI80XRX7nS6wSS3e7du5k9ezajRo1i3rx5VK9e3etIIiJFni8m8kVHe51AANLT03n//ffp0KEDtWrVYv369ZQrV87rWCIiEuCLnv6ll3qdQHbs2MF1113HzTffzCeffAKggi8iUsD4oqcv3po3bx7dunVj7969vPTSS1x33XVeRxIRkRz4oqe/c6fXCYquJ554gtatW1O+fHmWLVvGv//9by22IyJSQPmi6M+e7XWCouvSSy/ljjvuIC4ujksuucTrOCIichy+GN7X4jzB9dZbb7Fx40b69+9Pq1atdBtcEZFCwhc9/XbtvE5QNCQmJtK7d286d+7MBx98QGpqqteRRETkJAS96BtjJhljvjXGDDnG78saYz4zxswxxrxnjAkPdkY52qpVq4iOjmbSpEkMHDiQL774gmLFfDFQJCJSZAS16BtjbgJCrbVNgHONMbVz2Kwr8LS1tjWwDWgbzIxytL1793LFFVfw119/MXfuXMaMGUNYWJjXsURE5CQFu6d/FfBW4PEc4IrsG1hrX7LWzg38WBHYkX0bY0wfY0ycMSYO4J138idsUZeUlARA+fLlmTp1KvHx8bRs2dLjVCIicqqCXfQjgS2Bx3uAysfa0BjTBChvrf0u+++stROttdHW2miA5OT8iFq0ff3111xwwQV88MEHAHTo0IFKlSp5nEpERE5HsIv+AaBE4HGpYx3fGFMBeAG4PTc7vemmPMkmQFpaGiNHjqR58+aEh4drzXwRER8JdtFfTuaQfhTwe/YNAhP33gYGWms35manxYvnVbyi7Y8//qBly5YMHz6cLl26sGLFCqJ1YwMREd8IdtF/H+hmjHka6AT8aIwZnW2bfwENgMHGmIXGmM5BzlhkLViwgLi4OKZOncqMGTMoU6aM15FERCQPGWttcA9oTHmgFfCltXbb6e4vomptO3D0l4z4V9XTD1cEJScns2LFCpo0aYK1lj///JNq1ap5HUtERI7DGLM8Y17byQj6dfrW2r3W2rfyouBn2LAhr/ZUtKxbt47LLruMVq1asXPnTowxKvgiIj7mixX5GjXyOkHhYq1lypQpNGzYkM2bNzNr1iwqVqzodSwREclnvij6557rdYLCIy0tjW7dutGrVy8aNWpEfHw87du39zqWiIgEgdZRLWJCQ0OpVKkSo0aNYuDAgYSGhnodSaTA2bdvHzt27CAlJcXrKFLEhIWFUalSpXybSO2Lor9lC6C7uh5Teno6Tz/9NFdeeSWNGzfm6aef9jqSSIG1b98+tm/fTvXq1WwMDRsAABwOSURBVClRogTGGK8jSRFhrSUpKYktW9wadvlR+H0xvP/dUWv2SYbt27dz7bXX0r9/f9544w2v44gUeDt27KB69eqULFlSBV+CyhhDyZIlqV69Ojt2HLUCfZ7wRU9fE85zNmfOHLp3705CQgITJkygb9++XkcSKfBSUlIoUaLEiTcUySclSpTIt1NLvij6TZp4naDgmT9/Pm3atKFu3brMmzePiy++2OtIIoWGevjipfz89+eL4X3JlJaWBsBVV13Fk08+ybJly1TwRUQE8EnRT0/3OkHB8Oabb1K3bl22bdtGaGgoDz74ICVLlvQ6loh4bNeuXdx6662UL1+eSpUqMXTo0L9/d+jQIe68807Kli1L5cqVGTNmzN+/GzFiBMYYQkJCqFSpEp06dWLdunVevATJI74o+h9+6HUCbyUmJnLHHXcQGxtLhQoVdJmRiByhc+fObN26lXfeeYeBAwcyduxY3nzzTQDuvfdePvnkE2bMmMHIkSN55JFHeOedd/5+btWqVfnuu+949tlnWbVqFU2bNmXTpk1evRQ5Tb44p1+UT7+tWrWKzp07s27dOgYNGsSIESMICwvzOpaIFBC///47CxYsYMWKFVx66aW0aNGCr776imnTptGsWTNee+01ZsyYwfXXXw/At99+ywsvvMDNN98MQHh4ODExMcTExNCiRQvOP/98xo4dy4QJE7x8WXKKfFH0b7jB6wTeGTNmDAkJCcydO5eWLVt6HUdECpg9e/YAbog/wxNPPEFCQgLz588nLS2NVq1a/f27Sy+9lE8//TTHfVWpUoXrr7/+mL+Xgs8Xw/tFzZ49e9i8eTMAL730EvHx8Sr4IpKjiy66iLPPPpuePXvy7rvvYq3lvPPOo2HDhqxdu5bSpUtzxhln/L19jx49+OKLL465v3r16rFp0yaSkpKCEV/ymC+KflEa3f/qq6+oX78+t956K9ZaKlSooJvliMgxRURE8NFHHxEREcHNN99MdHQ03377LeB6/9lXfStXrhwXXXTRMfdXvnx5AP7666/8Cy35xhdFvyisyJeWlsbIkSO56qqriIiI4Nlnn9W1xCJBZMzR84euv961ffRRZtvEia6tT5/Mtq1bXVv2hcQaNnTty5dnto0Y4dpGjMhsy/r7UxEVFcXatWt56aWX2Lp1K1dddRWffPIJKSkphIS4MvDdd99hjPn761j0vlO4+aLo79zpdYL8tWPHDlq2bMnw4cO59dZbWbFiBQ0bNvQ6logUIuHh4fz73/9m9erV1KlTh759+xIZGUliYiLghu2///57XnnllePuZ+/evQCULVs23zNL3vNF0Y9p7HWC/BUZGcnBgweZOnUq06dPp3Tp0l5HEilyrHVfWX30kWsLTHwHXA/fWtfjz1CtmmvbuvXI5y9f7tqzfoYfMcK1Ze3pn85n/FdeeYW2bdv+/fOZZ57J0KFD2bJlC2eccQZ79uwhISGBkiVLUr9+fSpXrnzc/f3www+cc845WgOkkPJF0a9cyesEee/QoUOMHj36/9u7+/ioqjOB47+HEPICLIEACVAhNVCkEEmjvGo1qJQXPyKLSJBQiIKAFVxwBZSCCaDtYltKV6mI1bC1W9ZVtoJSkJdKKC1oQF7KGivWCGxUCIgiIQmEPPvHnQyTkJAXMjPk5vl+PvNxZu6dc597HPLMPefccygoKKB58+bs2rWLCRMmBDssY0wDEx4eztatW8v1wZ88eZKIiAhGjRoFwJs+/RP79++vsqz8/HzWrVvHyJEj/Rew8StX3LLnNh9++CFjx45l//79dOvWjZSUFG+/mzHG1MZdd91F69atGT16NI8//jjHjx8nPT2dKVOmkJCQwL333sv06dMBCAkJuWTp7XPnzpGdnc0//vEPnnrqKVq2bMm8efOCcSqmHrgikxw+HOwI6oeq8vLLL3PDDTeQl5fHW2+9RUpKSrDDMsY0YFFRUWzZsoXS0lJGjRrFE088wYQJE1iyZAkAq1at4t577+Whhx4iIyODhx9+uNznP//8c/r168fMmTPp27cv7777rt0x1ICJVuykamDCOnTTqbO28+9zOgQ7lCu2ePFinnzySQYNGsTvfvc7OtqawcYEXE5ODj169Ah2GKaRq+57KCJ7VPXG2pbriub9zl2CHcGVUVVEhNTUVJo1a8Zjjz1GSEhIsMMyxhjjMq5o3u/53WBHUDelpaX87Gc/Y8yYMagq1157LXPnzrWEb4wxxi9ckfQbomPHjjF8+HDmzJlDaWkpRUVFwQ7JGGOMy7ki6Rc2sHy5adMmevfuTVZWFitWrOD1118nIiIi2GEZY4xxOVck/e3bgx1BzZ09e5a0tDSio6PJzs5m6tSpNq2lMcaYgHDFQL6I8GBHUL2jR4/SsWNHIiMjefvtt4mPj7cZrYwxxgSUK670b7kl2BFc3quvvkqvXr2898UmJCRYwjfGGBNwrkj6V6uCggImT57M2LFj6dmzJ+PGjQt2SMYYYxoxS/p+8re//Y0bb7yRl19+mXnz5pGVlUVcXFywwzLGGNOIuSLp79wV7AguVVhYyNmzZ9myZQtPP/00oaGhwQ7JGNPIrFq1ChFBRGjSpAldunThscce8y6n669jBuoC59NPP/WeX8XHqlWrAhJDQ+OKgXwFZ4IdgePkyZOsXbuWBx54gL59+3Lo0CGaNWsW7LCMMY1cdnY2586d47333mPBggUcO3aMV155Jdhh1ZsVK1ZwQ4X1h7/97W8HKZpL7du3j23btjFz5sxgh+KOpN+/f7AjgO3bt5Oamsrx48e57bbbiIuLs4RvjLkq3HijM0X7wIEDKSgoYNGiRfzmN78hLCwsyJHVj+7du3vP8Wq0b98+li1bdlUkfVc077doEbxjl5SUkJGRwaBBg4iIiGDnzp3Wd2+MuWolJSVx7tw5Tp48GexQTBC4IukHi6oyYsQIFi5cSGpqKnv27CEpKSnYYRljTJWOHTuGiBAdHQ1AXl4eI0eOpFWrVsTGxjJr1ixKS0uBi33m+/btY/To0bRo0YLrrruOnTt3esv74IMPuOmmmwgPD2fAgAHk5uaWO96pU6cYP348LVq0IDY2loULF1K2umtycjJTp06lT58+tGnThvXr1zNgwACioqJ444036uV8i4uLmTFjBm3atKF169bMmDGD4uJi7/Zt27YhIly4cIHFixcTFxdXruvj/PnzzJ07l5iYGKKjo0lLS+P06dPe7adPn2bixIm0a9eOqKgoRo0aRX5+PgAZGRmICPfffz+HDx/2jjfIyMiol3OrE1Vt0I9msV312T98psHyyiuv6G9/+9ugHd8YU78++OCDYIdQbzIzM9X5M+84ePCgdu/eXe+44w7ve7feeqv26tVLt2zZoq+//rq2adNGMzMzVVU1NzdXAe3Vq5dOnz5dN2/erElJSZqYmKiqqufPn9du3brpgAEDdOPGjbpo0SINDQ3VLl26eMv/wQ9+oN/5znd07dq1umLFCm3RooX+5Cc/8R67ZcuWumbNGu3du7c2bdpUMzMzdciQITps2LBqz68svnfeeafKfR588EGNjY3V3//+97p69WqNiYnRKVOmeLe/8847CuiUKVO0T58++stf/lJzcnK82+fOnasxMTH66quv6ltvvaXx8fGakpLi3T5jxgzt2LGjrl27VtetW6cJCQk6efJkVVXNy8vT7OxsTU9P1w4dOmh2drZmZ2drXl5etedW3fcQ2K11yJmu6NM/fCRwxyoqKmL27NkkJSVx//33M378+MAd3BgTFHGPrw92CAB8+m931ulzvlN9JyUl8dJLLwHORd+4ceO46aab6NmzJyUlJSxfvpx3332XtLQ072d69OjBs88+C8C8efMYO3Ys4KwjcujQITZs2EB8fDxDhgxh7969vP/++wDs2LGDTZs2sXfvXhITEwFnKvIFCxbw6KOPAnDfffcxatQo1q5dS0xMDGlpaeTm5pKVlVXj8xs0aFC517m5ucTFxXHkyBFeeukl1qxZw8iRIwEICwtj9OjRzJ8/n2uuucb7mZycHHbs2FFuLFZhYSHLli3jhRdeYMyYMQCcOHGCBx98kKKiIsLDwzly5Ai9e/dmxIgRAHTr1o0vv/wSgI4dO9KxY0cOHjxIs2bNropxB65o3r/22sAcJycnh379+vHcc8/x8ccfB+agxhhzhfbu3cv69esREebMmUPnzp0B58fAmDFjePvtt7nzzjuJiYlh27ZtFBYWlvv8lClTvM+jo6MpKSkB4NChQ7Rp04b4+Hjv9lt8pkjdt28frVq18iZ8cJr0CwoKvH9DO3To4I3F93ltvPjii+zdu9f76NixIwAHDhygtLSU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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_scores_forest=y_probas_forest[:,1]\n",
    "fpr_forest,tpr_forest,thresholds_forest=roc_curve(y_train_5,y_scores_forest)\n",
    "y_scores_forest\n",
    "plt.figure(figsize=(8,6))\n",
    "plt.plot(fpr,tpr,\"b:\",linewidth=2,label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest,tpr_forest,\"Random Forest\")\n",
    "plt.legend(loc=\"lower right\",fontsize=16)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9824753559693319"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred_forest=cross_val_predict(forest_clf,x_train,y_train_5,cv=3)\n",
    "precision_score(y_train_5,y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8273381294964028"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5,y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多元分类器 \n",
    "## 随机森林和朴素贝叶斯分类器\n",
    "## 向量机svm和线性分类器只能处理二元分类\n",
    "### 解决方案 将数字图片0~9 训练10个二元分类器 每个数字一个\n",
    "### 为每一对数字训练一个二元分类器，区分0，1 0，2 0，3 OVO策略"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([7.])"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.fit(x_train,y_train)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-635401.90437599, -636265.23958283, -281658.45846965,\n",
       "        -126817.95842276, -429987.95044073, -311246.19273626,\n",
       "        -948444.27988046,  301848.6365204 , -331880.49167655,\n",
       "        -315676.26484309]])"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "some_digit_scores=sgd_clf.decision_function([some_digit])\n",
    "some_digit_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(some_digit_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7.0"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_[np.argmax(some_digit_scores)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7.])"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(max_iter=7,tol=-np.infty,random_state=42))\n",
    "ovo_clf.fit(x_train,y_train)\n",
    "ovo_clf.predict([some_digit])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7.])"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forest_clf.fit(x_train,y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.]])"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forest_clf.predict_proba([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.85122975, 0.8539427 , 0.86297945])"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(sgd_clf,x_train,y_train,cv=3,scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.90976805, 0.90819541, 0.91118668])"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "x_train_scaled = scaler.fit_transform(x_train.astype(np.float64))\n",
    "cross_val_score(sgd_clf,x_train_scaled,y_train,cv=3,scoring=\"accuracy\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 90%正确    分析剩下的10%错误"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.探索数据准备\n",
    "## 2.尝试多个模型\n",
    "## 3.选择最佳并且用GridSearchCV调惨\n",
    "## 4.尽可能自动化  shell脚本"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 确定了一个相对适合的模型 进一步优化 分析错误类型\n",
    "# 查看混淆矩阵\n",
    "# 使用 cross_val_score\n",
    "# 使用 confusion_matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n",
      "D:\\LE\\AC\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[5743,    3,   23,    9,   11,   38,   42,   10,   41,    3],\n",
       "       [   1, 6477,   46,   27,    6,   38,    8,   11,  117,   11],\n",
       "       [  51,   38, 5359,   96,   79,   25,   87,   63,  147,   13],\n",
       "       [  46,   46,  143, 5345,    3,  205,   44,   63,  143,   93],\n",
       "       [  21,   30,   39,    8, 5375,    9,   62,   36,   88,  174],\n",
       "       [  67,   44,   38,  197,   71, 4583,  115,   27,  186,   93],\n",
       "       [  41,   24,   57,    2,   40,   74, 5630,    6,   44,    0],\n",
       "       [  24,   22,   69,   31,   64,   10,    6, 5823,   14,  202],\n",
       "       [  49,  156,   81,  148,   17,  149,   58,   29, 5042,  122],\n",
       "       [  49,   37,   24,   92,  185,   37,    3,  219,   97, 5206]],\n",
       "      dtype=int64)"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf,x_train_scaled,y_train,cv=3)\n",
    "conf_mx = confusion_matrix(y_train,y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.matshow(conf_mx,cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [],
   "source": [
    "row_sums= conf_mx.sum(axis=1,keepdims=True)\n",
    "norm_conf_mx=conf_mx/row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP0AAAEACAYAAAB4TnCPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAC4JJREFUeJzt3W+olvd5wPHv5fEcU89cazBRBiUSkLyYUrsc0gVm/pSuuEAoWzo6LBraLaajtAl5lbIVWV9kpCTNC8FQ+2cQarKlgS2UtNAx0FVoKIYSAtahBMUIYmzUpcE4T7z2wuMS7OpzH7l/z+3h+n5eHT13rnNxzNffc47Pc5/ITCTVsWjoBSSNl9FLxRi9VIzRS8UYvVSM0UvFGH0HEfHhiPhJRPw0Iv41IqaG3qmLiFgZEb8ceo/5iIgdEXHv0Ht0ERHLI+LHEbEvIr499D5dDRJ9RHwvIn4eEX8/xMe/Cp8HvpWZnwaOAxsH3qerJ4APDb1EVxGxAViVmT8aepeONgO7MnMGWBYRM0Mv1MXYo4+IvwAmMvN24OaIWDPuHeYrM3dk5r/P/fIG4MSQ+3QREZ8E3uHiX1LXvIiYBL4DHI6Izwy9T0e/BtZGxEeAjwJHB96nkyFO+ruA5+fe/inwJwPscFUi4nZgeWa+PPQuVzL35cfXgUeH3mUetgD7gW8Ct0XEVwbep4u9wE3AV4FfAW8Nu043Q0Q/DRybe/stYOUAO8xbRFwPbAe+OPQuHTwK7MjM00MvMg8fB3Zm5nHgB8DdA+/TxTbgS5n5DeAA8IWB9+lkiOh/w/tfZ/7eQDvMy9zJ+UPga5l5ZOh9OvgU8OWI2A2sj4jvDrxPF4eAm+fengEWwud5ObAuIiaATwAL4oUsMe4X3ETEFuDGzHwiIv4B+K/MfHasS8xTRPwt8Bjw6txvPZ2Z/zLgSp1FxO7MvGvoPUaJiGXA97n4yG8S+GxmHrvyfzWsiLgN+CcuPsT/OfDnmfmbYbcabYjofx/4GfAfwJ8Bf5yZZ8a6hFTY2KOHi/++Cfwp8J9zX8NJGpNBopc0nGv+m2iS+mX0UjGDRR8RW4f62FfLndtbaPvCwtt5yJN+QX2i5rhzewttX1hgO/vwXiqm1+/eR8SC+6eAycnJztdeuHCBRYu6/T353nvvXe1KvcpMIqLTtVNTbV4x3PXjA8zOzrJ48eLO1587d+5qVhppyZIlna+d785nz569mpVGysxOn+jumw5oYmKi2ewbb7yxydxTp041mQt0/otnvlavXt1k7nyCmK+DBw82mbtmTbsXf7722mu9z5zPIePDe6kYo5eKMXqpGKOXijF6qRijl4rpFP0CvHutpN9hZPQL8e61kn63Lif9XSzQu9dK+m1dor/i3WsjYuvcT/jY1/dykvrX5fmRV7x7bWbuBHbCwnzuvVRNl5P+Fd5/SP8x4HCzbSQ11+Wk/zfgZxHxB8zdvbbtSpJaGnnSZ+Z/c/GbeS8Dd3u7amlh6/Sax8w8xfvfwZe0gPmMPKkYo5eKMXqpGKOXiun95mXzuQliVy1vMrlixYpms1t58803m8w9f/58k7mHDh1qMhfa3T9x48aNTeZCm/v6zedmm570UjFGLxVj9FIxRi8VY/RSMUYvFWP0UjFGLxVj9FIxRi8VY/RSMUYvFWP0UjFGLxVj9FIxRi8VY/RSMUYvFWP0UjFGLxVj9FIxRi8V0+stsKenp1m/fn2fIwE4c6bdz8x89dVXm8x9+OGHm8wFOHnyZJO5e/bsaTJ38+bNTeYCvPHGG03m3nrrrU3mAixe3Pud5+d163lPeqkYo5eKMXqpGKOXijF6qRijl4oxeqkYo5eKGfksgYj4MPDPwATwDvC5zPyf1otJaqPLSf954FuZ+WngOLCx7UqSWhp50mfmjg/88gbgRLt1JLXW+Wv6iLgdWJ6ZL1/2+1sjYl9E7Judne19QUn96hR9RFwPbAe+ePn7MnNnZs5k5kyLFxJI6tfI6CNiCvgh8LXMPNJ+JUktdTnp/xr4I+DvImJ3RHyu8U6SGuryjbyngafHsIukMfDJOVIxRi8VY/RSMUYvFWP0UjG9PpsmMzl37lyfIwG47rrrep95yTPPPNNk7pYtW5rMBZiYmGgy99ixY03mbtzY7uUaK1eubDL37NmzTeYCbNq0qfeZL7zwQudrPemlYoxeKsbopWKMXirG6KVijF4qxuilYoxeKsbopWKMXirG6KVijF4qxuilYoxeKsbopWKMXirG6KVijF4qxuilYoxeKsbopWKMXiomMrO3YZOTk7lixYre5l0yPT3d+8zWsw8ePNhkLrS7PfPSpUubzL3zzjubzAU4cqTNT0+/4447mswFePDBB3ufuWnTJvbv3x9drvWkl4oxeqkYo5eKMXqpGKOXijF6qRijl4rpFH1ErIyIX7ZeRlJ7XU/6J4APtVxE0niMjD4iPgm8Axxvv46k1q4YfURMAV8HHh3POpJaWzzi/Y8COzLzdMT//7TeiNgKbAVYtMjvC0rXulGVfgr4ckTsBtZHxHcvvyAzd2bmTGbOGL107bviSZ+Z//dSo4jYnZl/034lSS11Ppoz866Ge0gaEx+PS8UYvVSM0UvFGL1UjNFLxRi9VMyoZ+TNy7Jly9iwYUOfIwE4evRo7zMveffdd5vMffvtt5vMBbj//vubzN21a1eTuffcc0+TuQBPPfVUk7mPPfZYk7kAjz/+eO8zT5061flaT3qpGKOXijF6qRijl4oxeqkYo5eKMXqpGKOXijF6qRijl4oxeqkYo5eKMXqpGKOXijF6qRijl4oxeqkYo5eKMXqpGKOXijF6qZjIzN6GLV26NG+55Zbe5l1y8uTJ3mdesmbNmiZz9+zZ02QuwLp165rMbfFnB/D88883mQuwZMmSJnPXrl3bZC7AK6+80mRuZkaX6zzppWKMXirG6KVijF4qxuilYoxeKsbopWKMXiqmc/QRsSMi7m25jKT2OkUfERuAVZn5o8b7SGpsZPQRMQl8BzgcEZ9pv5Kklrqc9FuA/cA3gdsi4isffGdEbI2IfRGxb3Z2tsWOknrUJfqPAzsz8zjwA+DuD74zM3dm5kxmzixevLjFjpJ61CX6Q8DNc2/PAEfarSOptS5H8/eA70fEXwGTwGfbriSppZHRZ+bbwF+OYRdJY+CTc6RijF4qxuilYoxeKsbopWKMXiqm16fQzc7OcuLEiT5HAnDhwoXeZ14yPT3dZO7q1aubzAVYtWpVk7kvvfRSk7lTU1NN5gKcO3euydxDhw41mQtw+PDh3mfee2/3F8B60kvFGL1UjNFLxRi9VIzRS8UYvVSM0UvFGL1UjNFLxRi9VIzRS8UYvVSM0UvFGL1UjNFLxRi9VIzRS8UYvVSM0UvFGL1UjNFLxfR6N9ypqakmd4Hdtm1b7zMvee6555rMffLJJ5vMBXjggQeazH322WebzN2+fXuTuQCvv/76gpoL8OKLL/Y+8/Tp052v9aSXijF6qRijl4oxeqkYo5eKMXqpGKOXirli9BGxPCJ+HBH7IuLb41pKUjujTvrNwK7MnAGWRcTMGHaS1NCo6H8NrI2IjwAfBY62X0lSS6Oi3wvcBHwV+BXwVvONJDU1KvptwJcy8xvAAeALl18QEVvnvubfd/78+RY7SurRqOiXA+siYgL4BJCXX5CZOzNzJjNnJicnW+woqUejov9HYCdwBrgeaPOSNEljc8WX1mbmL4A/HNMuksbAJ+dIxRi9VIzRS8UYvVSM0UvFGL1UjNFLxfR6C2yACxcu9D2SRx55pPeZl5w5c6bJ3Onp6SZzAfbu3dtk7n333ddk7oEDB5rMBZidnW0yt+X/cw899FCz2V140kvFGL1UjNFLxRi9VIzRS8UYvVSM0UvFGL1UjNFLxRi9VIzRS8UYvVSM0UvFGL1UjNFLxRi9VIzRS8UYvVSM0UvFGL1UjNFLxUTmb/3I+asfFvEmcKTj5SuAk7198PFw5/YW2r5wbex8U2be0OXCXqOfj4jYl5kzg3zwq+TO7S20fWHh7ezDe6kYo5eKGTL6nQN+7Kvlzu0ttH1hge082Nf0kobhw3upGKOXijF6qRijl4oxeqmY/wUcaFPWHPFHRwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.fill_diagonal(norm_conf_mx,0)\n",
    "plt.matshow(norm_conf_mx,cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多标签分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=None, n_neighbors=5, p=2,\n",
       "           weights='uniform')"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "y_train_large=(y_train>=7)\n",
    "y_train_odd = (y_train %2==1)\n",
    "y_multilabel=np.c_[y_train_large,y_train_odd]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(x_train,y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ True,  True]])"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多输出分类\n",
    "## 构建一个系统去除图中的噪声 输入一张干净的数字图片，分类器是输出多个标签，一个像素一个标签 每个标签值0~255"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [],
   "source": [
    "noise = np.random.randint(0,100,(len(x_train),784))\n",
    "x_train_mod = x_train + noise"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [],
   "source": [
    "noise = np.random.randint(0,100,(len(x_test),784))\n",
    "x_test_mod = x_test + noise\n",
    "y_train_mod = x_train\n",
    "y_test_mod = x_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index =1200\n",
    "plt.subplot(121);plt.imshow(x_test_mod[some_index].reshape(28,28),cmap= matplotlib.cm.binary)\n",
    "plt.subplot(122);plt.imshow(y_test_mod[some_index].reshape(28,28),cmap= matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_clf.fit(x_train_mod,y_train_mod)\n",
    "clean_digit=knn_clf.predict([x_test_mod[some_index]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(clean_digit.reshape(28,28),cmap=matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
